programing

Numpy: 각 행을 벡터 요소로 나눕니다.

lovejava 2023. 6. 18. 10:00

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

고차원 어레이의 경우 다음을 사용할 수 있습니다.swapaxesNumPy 배열 방법 또는 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