numpy에 arange / linspace의 다차원 버전이 있습니까?


83

각 x가 {-5, -4.5, -4, -3.5, ..., 3.5, 4, 4.5, 5}에 있고 y에 대해서도 동일한 2d NumPy 배열 (x, y) 목록을 원합니다. .

나는 할 수있을 것이다

x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)

그런 다음 가능한 모든 쌍을 반복하지만 더 좋은 방법이 있다고 확신합니다.

나는 다음과 같은 것을 다시 원합니다.

[[-5, -5],
 [-5, -4.5],
 [-5, -4],
 ...
 [5, 5]]

그러나 순서는 중요하지 않습니다.


1
질문있으세요? 편집 : 질문을 본다xy = np.matrix([x, y])
Andy Kubiak

이것은 단지 두 배열을 연결합니다.
Hilemonstoer 2015-08-25

1
나는 약간 혼란 스럽습니다. "다음과 같은 것을 다시 원합니다 :"및 "각 x가 {-5, -4.5, -4, -3.5, ..., 3.5, 4, 4.5, 5}에있는 위치 y에 대해서도 동일합니다. "가 일치하지 않는 것 같습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


78

np.mgrid이를 위해 사용할 np.meshgrid수 있으며 한 단계로 배열을 생성하기 때문에 종종 더 편리 합니다.

import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]

들어 linspace 같은 기능, 단계 (즉, 대체 0.5포함) 복소수 크기는 시리즈에서 원하는 지점의 수를 지정합니다. 이 구문을 사용하면 위와 동일한 배열이 다음과 같이 지정됩니다.

X, Y = np.mgrid[-5:5:21j, -5:5:21j]

그런 다음 다음과 같이 쌍을 만들 수 있습니다.

xy = np.vstack((X.flatten(), Y.flatten())).T

@ali_m이 제안했듯이이 모든 작업을 한 줄로 수행 할 수 있습니다.

xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T

행운을 빕니다!


16
... 또는 한 줄, 등xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2, -1).T
ali_m

23

이것은 당신이 찾고있는 것입니다.

matr = np.linspace((1,2),(10,20),10)

이것은 다음을 의미합니다.

첫 번째 열의 경우; (1,2) 중 1에서 (10,20) 중 10까지 증가하는 숫자 10을 넣으십시오.

두 번째 열의 경우; (1,2) 중 2 개에서 (10,20) 개 중 20 개까지 증가하는 10 개의 숫자를 입력합니다.

결과는 다음과 같습니다.

[[ 1.  2.]
 [ 2.  4.]
 [ 3.  6.]
 [ 4.  8.]
 [ 5. 10.]
 [ 6. 12.]
 [ 7. 14.]
 [ 8. 16.]
 [ 9. 18.]
 [10. 20.]]

예를 들어 다음과 같이 말하면 한 열의 값만 늘릴 수도 있습니다.

matr = np.linspace((1,2),(1,20),10)

첫 번째 열은 10 회 동안 (1,2) 중 1에서 (1,20) 중 1까지입니다. 즉, 1로 유지되고 결과는 다음과 같습니다.

[[ 1.  2.]
 [ 1.  4.]
 [ 1.  6.]
 [ 1.  8.]
 [ 1. 10.]
 [ 1. 12.]
 [ 1. 14.]
 [ 1. 16.]
 [ 1. 18.]
 [ 1. 20.]]

1.16 이전의 numpy 버전에서는 오류가 발생합니다. stackoverflow.com/questions/57269217/…
Techniquab

이것은 2 차원이 아닙니다.
oulenz

또한 입력으로 목록과 함께 작동합니다! meshgrid위한 전처리 단계로서 그레이트
유리 펠드만

13

나는 당신이 원한다고 생각합니다 np.meshgrid:

좌표 벡터에서 좌표 행렬을 반환합니다.

1 차원 좌표 배열 x1, x2, ..., xn이 주어지면 ND 그리드에서 ND 스칼라 / 벡터 필드의 벡터화 된 평가를위한 ND 좌표 배열을 만듭니다.

import numpy as np
x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
X,Y = np.meshgrid(x,y)

원하는 출력으로 변환 할 수 있습니다.

XY=np.array([X.flatten(),Y.flatten()]).T

print XY
array([[-5. , -5. ],
       [-4.5, -5. ],
       [-4. , -5. ],
       [-3.5, -5. ],
       [-3. , -5. ],
       [-2.5, -5. ],
       ....
       [ 3. ,  5. ],
       [ 3.5,  5. ],
       [ 4. ,  5. ],
       [ 4.5,  5. ],
       [ 5. ,  5. ]])

이것은 내가 원하는 쌍의 행렬을 얻기 위해 여전히 반복해야한다고 생각하는 두 개의 큰 행렬을 반환합니다. 내가 잘못?
Hilemonstoer 2015-08-25

내 편집보기 : 반복없이 원하는 배열로 매우 쉽게 변환 할 수 있습니다.
tmdavison

numpy에서는 반복이 거의 필요하지 않습니다.)
OrangeSherbet

6

쌍을 반복하고 한 번에 전체 포인트 집합에 대해 계산을 수행하지 않으 itertools.product려면 가능한 모든 쌍을 반복 하는 것이 가장 좋습니다 .

import itertools

for (xi, yi) in itertools.product(x, y):
    print(xi, yi)

이것은를 통해 큰 행렬을 생성하는 것을 방지 meshgrid합니다.



1

질문을 이해하는지 확실하지 않습니다 -2 요소 NumPy 배열 목록을 만들려면 다음 과 같이 작동합니다.

import numpy as np
x = np.arange(-5, 5.1, 0.5)
X, Y = np.meshgrid(x, x)
Liszt = [np.array(thing) for thing in zip(X.flatten(), Y.flatten())] # for python 2.7

zip 튜플 목록을 제공하고 나머지는 목록 이해력으로 처리합니다.


0

초고속 솔루션은 아니지만 모든 차원에서 작동합니다.

import numpy as np
def linspace_md(v_min,v_max,dim,num):
    output = np.empty( (num**dim,dim)  )
    values = np.linspace(v_min,v_max,num)
    for i in range(output.shape[0]):
        for d in range(dim):
            output[i][d] = values[( i//(dim**d) )%num]
    return output

0

이 명령을 고수하는 것을 선호하기 때문에 Linspace로 여전히 수행했습니다.

다음 형식으로 만들 수 있습니다. np.linspace (np.zeros ( width ) [0], np.full ((1, width ),-1) [0], height )

np.linspace(np.zeros(5)[0],np.full((1,5),-1)[0],5)

다음을 출력합니다.

array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [-0.25, -0.25, -0.25, -0.25, -0.25],
       [-0.5 , -0.5 , -0.5 , -0.5 , -0.5 ],
       [-0.75, -0.75, -0.75, -0.75, -0.75],
       [-1.  , -1.  , -1.  , -1.  , -1.  ]])

.tranpose () 를 추가 하면 다음을 얻을 수 있습니다.

array([[ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ]])

-1

이 예를 바탕으로 원하는 어둡게 만들 수 있습니다.

def linspace3D(point1,point2,length):
    v1 = np.linspace(point1[0],point2[0],length)
    v2 = np.linspace(point1[1],point2[1],length)
    v3 = np.linspace(point1[2],point2[2],length)
    line = np.zeros(shape=[length,3])
    line[:,0]=v1
    line[:,1]=v2
    line[:,2]=v3
    return line
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.