2017-01-25 1 views
2

나는 n 값을 가진 numpy 1 차원 배열을 가지고 있는데, xdata이라고 부를 수 있습니다.다차원 배열을 만드는 방법은 무엇입니까?

이 배열의 각 차원에 특정 범위의 값인 xdata의 값이 포함되도록 xdataMulti이라고하는 다차원 배열을 만들려고합니다. 예를 들어

등이

xdata = np.array([-0.879645943,-0.7897614865,-0.7051130178,-0.6108652382,-0.5270894341,...]) 

내가 xdataMulti[:,0]-0.9-0.6 사이 XDATA의 모든 값을 넣어 원하는 및 -0.6 사이의 모든 값과 xdataMulti[:,1]에서 0,

어떻게 말할 수 있습니다 xdataMulti을 작성하고 채 웁니다. (얼마나 많은 범위가 있고 그 끝점은 미리 알고 있지만 각 범위에 xdata의 포인트가 얼마나되는지는 모릅니다. 알아 내기 위해 xdata을 반복해야합니까?)

+1

정렬! 각 차원의 항목 길이는 동일해야합니다. – Lagerbaer

+1

다양한 크기의 배열 목록을 설명합니다. – hpaulj

+0

예 다양한 크기의 배열 목록입니다. numpy 배열 만 받아들이는 scipy 함수를 호출하기 위해서는 각각 numpy 배열이 필요합니다. – user2175783

답변

2

범위의 전화 번호가 너무 크지 않으면 당신이 손

f는 당신의 scipy 기능입니다
gm09 = xdata >= -0.9 
gm06 = xdata >= -0.6 
g0 = xdata >= 0 
ranges = [xdata[gm09 & ~gm06], xdata[gm06 & ~g0]] 
result = [f(r) for r in ranges] 

에 의해 그들을 만들 수 있습니다.

범위 수가 큰 경우 데이터를 정렬 한 다음 searchsorted을 사용할 수 있습니다. 당신은 정렬 된 배열 bnd에 블록의 경계를 한 가정이 당신의 범위가 정렬됩니다 점에서 최초의 솔루션과 다른 것을

xs = np.sort(xdata) 
xbnd = np.searchsorted(xs, bnd) 
ranges = [xs[l:r] for l, r in zip(xbnd[:-1], xbnd[1:])] 
result = [f(r) for r in ranges] 

참고. 당신이 사용할 수있는 원래의 순서를 유지해야하는 경우

간접 NumPy와 (멀티) 차원 배열이 의미있는 것을 정말 아니라고

order = np.argsort(xdata) 
xbnd = np.searchsorted(xdata[order], bnd) 
ordord = [np.sort(order[l:r]) for l, r in zip(xbnd[:-1], xbnd[1:])] 
ranges = [xdata[oo] for oo in ordord] 
result = [f(r) for r in ranges] 
+1

가운데 코드에서 xbnd = np.searchsorted (xs, bnd) 범위의 [xs [1 : r]은 1, r은 zip (xbnd [: - 1], xbnd [1 :])] result = [범위 내의 r에 대한 f (r)] * xbnd가 [6,18]이고, zip이 [(6,18)]이고 ranges 객체는 6 및 18 (0과 6 사이 및 18 및 마지막은 쑤시 어지 않습니다). – JennyToy

+1

@JennyToy 흠, 그것이 어떻게되어야할까요? xbnd가 6으로 시작하면 xdata의 최소 6 개 값이 가장 작은 bin 경계 아래에 있으므로 원래 Q의 관점에서 볼 때 빈이 없습니다.이러한 이상 치를 수집하려면 xbnd = np.r_ [0, xbnd, len (xdata)]와 같은 것을 할 수 있습니다. –

1

다차원 배열은 직사각형이어야합니다. 따라서 모든 행/열의 길이가 같지 않으면 운이 없으면됩니다.

그러나이를 처리 할 방법이 있습니다. 한 가지 방법은 listarrays를 창출하는 것입니다 : 다차원 배열, 배열의 단지 목록 아니지만, 필요에 따라하는 것은 충분 수

>>> arr = np.random.random((10)) # using this for values 

>>> # each item in ranges corresponds to the lower and upper border. 
>>> ranges = [(0, 0.3), (0.3, 0.6), (0.6, 1)] 

>>> [arr[(arr >= lower) & (arr < upper)] for lower, upper in ranges] 
[array([ 0.15346374]), 
array([ 0.38144735, 0.45017858, 0.52710788, 0.36339812]), 
array([ 0.79770651, 0.77543868, 0.94824291, 0.87412998, 0.70890894])] 

합니다.

관련 문제