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


119

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 배열의 각 행에 대해 작업을 수행하려면 어떻게해야합니까?

답변:


181

여기 있습니다. 당신 은 방송과 함께 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]])

13
여기 에 문서가 있습니다.
sazary 2015


최신 버전의 numpy (1.18.1)를 사용하는 @ user108569는 None여전히 np.newaxis. 설정이 무엇인지 또는 발생하는 정확한 문제를 잘 모르겠지만 대답은 여전히 ​​유효합니다.
JoshAdel

11

앞서 언급했듯이, slicing with None또는 with np.newaxes는이를위한 좋은 방법입니다. 또 다른 대안은 다음과 같이 전치 및 방송을 사용하는 것입니다.

(data.T - vector).T

(data.T / vector).T

고차원 배열 swapaxes의 경우 NumPy 배열 또는 NumPy 방법 을 사용할 수 있습니다.rollaxis 함수 있습니다. 이 작업을 수행하는 방법은 정말 많습니다.

방송에 대한 자세한 설명은 http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html을 참조 하십시오.


4

JoshAdel의 솔루션은 np.newaxis를 사용하여 차원을 추가합니다. 또 다른 방법은 reshape () 를 사용 하여 방송을 준비 할 때 차원을 정렬하는 것 입니다.

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]])

reshape ()를 수행하면 방송을 위해 치수를 정렬 할 수 있습니다.

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]])

2

이를 수행하는 Pythonic 방법은 ...

np.divide(data.T,vector).T

이것은 모양 변경을 처리하며 결과는 부동 소수점 형식입니다. 다른 답변에서는 결과가 반올림 된 정수 형식입니다.

# 참고 : 데이터와 벡터의 열이 일치하지 않아야합니다.


참고 : 이것은 OP가 요청한 작업을 수행하지 않습니다. 최종 결과는 array ([[1., 0.5, 0.33333333], [2., 1., 0.66666667], [3., 1.5, 1.]])입니다. 'Pythonic'일 수 있지만 올바르지 않습니다.
Mark Cramer

1
@MarkCramer 감사합니다. 올바른 결과를 제공하기 위해 내 답변을 수정했습니다.
shantanu pathak

1

stackoverflowuser2010의 답변에 추가하면 일반적인 경우에는 다음을 사용할 수 있습니다.

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는 동일한 내부 메모리의 뷰를 사용하여 재구성하기 때문에 효율적입니다.


이것은 받아 들여진 대답이어야합니다. 로 열 벡터를 만드는 것은 .reshape(-1,1) 브로드 캐스팅을 사용하는 가장 직관적 인 방법입니다.
Paul Rougieux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.