2017-12-13 25 views
1

2D numpy 배열을 채우려고합니다. 내 경험에 의하면, 다음은 배열 크기에 맞게 확장되지 않습니다.2 진법 배열을 파이썬 방법으로 채우기

x=np.array([2,3,4]) 
y=np.array([1,3,9,13]) 
mat=np.zeros((x.size,y.size)) 
for i in range(nx): 
for j in range(ny): 
    if x[i] > y[j]: 
     mat[i,j] = 1 
    else: 
     mat[i,j] = -1 

이상적으로, 나는 그것이 1D에만

mat=np.asarray([foo(x_) for x_ in x]) 

있다면 간단 할 것입니다하지만 어떻게 차원 np.arrays이 일반화 같은 지능형리스트를 사용 하시겠습니까? 다른 numpy 기반 솔루션도 적합하지만 효율성은 여기에 키 메트릭입니다

+0

일반적인 솔루션을 원하십니까? 예를 들어 행렬의 삼각형 부분을 채우는 예와 같이 구체적으로 찾고 있습니까? – kazemakase

+0

내 응용 사례가 예제 중 하나입니다. 그러나 일반적인 솔루션은 아마도 더 많은 SO 사용자들에게 유용 할 것입니다 ... 마지막 코드 라인과 비슷하게 두 개의 입력을 가진 일반 foo (x_, y_)로 작동하는 것이 좋을 것입니다 – ErroriSalvo

답변

2

귀하의 mat :

In [352]: mat 
Out[352]: 
array([[ 1., -1., -1., -1.], 
     [ 1., -1., -1., -1.], 
     [ 1., 1., -1., -1.]]) 

방송 xy에 대하여 :

In [353]: x[:,None]>y 
Out[353]: 
array([[ True, False, False, False], 
     [ True, False, False, False], 
     [ True, True, False, False]], dtype=bool) 
where와 1/-1 배열에 마스크를 부울

차례 :

In [354]: np.where(x[:,None]>y,1,-1) 
Out[354]: 
array([[ 1, -1, -1, -1], 
     [ 1, -1, -1, -1], 
     [ 1, 1, -1, -1]]) 

아니면

(x[:,None]>y).astype(float)*2-1 

이중 루프에 맞게 0/1 배열에 부울 및 규모를 돌 수 있었다 두 개의 1 차원 어레이 또는리스트를 통해 이와 같은 연산을 종종 수행 할 수 있습니다 (outer).

2

은 2 개 차원 중첩 된 지능형리스트 구축 할 수 있습니다 :

mat = np.array([[1 if x_ > y_ else -1 for y_ in y] for x_ in x]) 

그러나이 꽤 읽을 수 없게 될 수 있습니다, 그리고 훨씬 아니다 성능 향상을 고려할 때 for 루프와는 다릅니다. Broadcasting 및 벡터화는 일반적으로 큰 배열을 더 잘 작동합니다 :

mat = (x[:, None] > y[None, :]) * 2 - 1 
1

시도 :

x=np.array([2,3,4]) 
y=np.array([1,3,9,13]) 
a = (x.reshape(x.shape[0], 1) - y) > 0 # a=(x.reshape(-1, 1) - y) > 0 
a = a.astype(int)*2 -1 
+1

또한'- 1 '을 사용하여'x.shape [0]'대신 재 형성합니다. – kazemakase

+0

@kazemakase, 네, 고마워요. – zyun

1

NumPy와 사용하는 경우 :

import numpy as np 
nx = x.size 
ny = y.size 
mat = np.sign(x * np.atleast_2d(np.ones(ny)).T - np.ones(nx) * np.atleast_2d(y).T) 
mat[np.where(mat==0)] = -1 

NumPy와가 (이 여기에 의미 무엇이든) 효율성에 대한 처리됩니다.

+0

결국, 당신은 (내 마지막 줄없이) 내 실제 문제에 대한 해결책이었습니다. 그러나, x == y 일 때 원하는 동작을 잘못 설명함으로써 질문에서 실수를 한 것이므로 받아 들일 수 없습니다. 하지만 고마워. :) – ErroriSalvo