Numpy: 각 행을 벡터 요소로 나눕니다.
내가 numpy 배열을 가지고 있다고 가정해 보겠습니다.
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
그에 상응하는 "벡터:"가 있습니다.
vector = np.array([1,2,3])
작업 방법data
각 행을 따라 감산 또는 나눗셈을 수행하여 다음과 같은 결과를 얻을 수 있습니다.
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
긴 이야기: 각 행에 해당하는 1D 배열의 스칼라로 2D 배열의 각 행에서 작업을 수행하려면 어떻게 해야 합니까?
여기 있어요.당신은 단지 사용하기만 하면 됩니다.None
(또는 다른 방법으로)np.newaxis
) 브로드캐스팅과 결합:
In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
앞서 언급한 바와 같이 슬라이싱은None
또는 와 함께np.newaxes
이것을 하는 좋은 방법입니다.또 다른 대안은 전치와 방송을 사용하는 것입니다.
(data.T - vector).T
그리고.
(data.T / vector).T
고차원 어레이의 경우 다음을 사용할 수 있습니다.swapaxes
NumPy 배열 방법 또는 NumPyrollaxis
기능.이것을 하는 방법은 정말 많습니다.
방송에 대한 자세한 설명은 http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html 을 참조하십시오.
이를 위한 파이썬적인 방법은...
np.divide(data.T,vector).T
이렇게 하면 모양이 변경되고 결과가 부동 소수점 형식으로 표시됩니다.다른 답변에서는 결과가 반올림된 정수 형식입니다.
#참고: 데이터와 벡터 모두에서 일치해야 하는 열이 없습니다.
스택 오버플로 사용자 2010의 답변에 추가하여 일반적인 경우에는 그냥 사용할 수 있습니다.
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
이것은 당신의 벡터를 변화시킬 것입니다.column matrix/vector
원하는 대로 요소별 작업을 수행할 수 있습니다.적어도 저에게는, 이것이 가장 직관적인 방법이며 (대부분의 경우) numpy는 재구성을 위해 동일한 내부 메모리의 뷰를 사용하기 때문에 효율적입니다.
Josh Adel의 솔루션은 np.new 축을 사용하여 차원을 추가합니다.다른 방법은 방송을 준비할 때 치수를 정렬하기 위해 모양 바꾸기()를 사용하는 것입니다.
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data
# array([[1, 1, 1],
# [2, 2, 2],
# [3, 3, 3]])
vector
# array([1, 2, 3])
data.shape
# (3, 3)
vector.shape
# (3,)
data / vector.reshape((3,1))
# array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])
모양 변경()을 수행하면 치수가 브로드캐스트를 위해 정렬될 수 있습니다.
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
참고:data/vector
괜찮아요, 하지만 그것은 당신이 원하는 답을 얻지 못해요.의 각 열을 나눕니다.array
(각 행의 각 해당 요소별)vector
분명히 모양을 바꾸면 얻을 수 있는 것입니다.vector
되려고1x3
대신에3x1
.
data / vector
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
핵심은 크기(3,)에서 (3,1)까지의 벡터 모양을 바꾸는 것입니다. 각 행을 요소로 나눕니다. (1,3): 각 열을 요소로 나눕니다.데이터로.모양이 벡터와 일치하지 않습니다.모양, NumPy는 벡터의 모양을 (3,3)까지 자동으로 확장하고 요소별로 분할을 수행합니다.
In[1]: data/vector.reshape(-1,1)
Out[1]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
In[2]: data/vector.reshape(1,-1)
Out[2]:
array([[1. , 0.5 , 0.33333333],
[2. , 1. , 0.66666667],
[3. , 1.5 , 1. ]])
유사:
x = np.arange(9).reshape(3,3)
x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
x/np.sum(x, axis=0, keepdims=True)
array([[0. , 0.08333333, 0.13333333],
[0.33333333, 0.33333333, 0.33333333],
[0.66666667, 0.58333333, 0.53333333]])
x/np.sum(x, axis=1, keepdims=True)
array([[0. , 0.33333333, 0.66666667],
[0.25 , 0.33333333, 0.41666667],
[0.28571429, 0.33333333, 0.38095238]])
print(np.sum(x, axis=0).shape)
print(np.sum(x, axis=1).shape)
print(np.sum(x, axis=0, keepdims=True).shape)
print(np.sum(x, axis=1, keepdims=True).shape)
(3,)
(3,)
(1, 3)
(3, 1)
언급URL : https://stackoverflow.com/questions/19602187/numpy-divide-each-row-by-a-vector-element
'programing' 카테고리의 다른 글
여러 .csv 파일을 한 번에 가져오는 방법은 무엇입니까? (0) | 2023.06.18 |
---|---|
cx_Oracle 및 예외 처리 - 모범 사례? (0) | 2023.06.18 |
vuex를 사용하여 로컬 스토리지에 저장하는 다크 모드 (0) | 2023.06.18 |
행 가져오기의 Oracle 크기를 더 높게 설정하면 앱 속도가 느려집니까? (0) | 2023.06.18 |
노드에서 사용자의 IP 주소를 확인하는 방법 (0) | 2023.06.18 |