如何创建多维numpy数组?

时间:2017-01-25 21:58:23

标签: python numpy multidimensional-array

我有一个带有n个值的numpy 1维数组,可以调用它xdata

我想创建一个多维的numpy数组,让我们调用它xdataMulti,这样这个数组的每个维都包含xdata中某个范围内的值。

例如,让我们说

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

并且我想将-0.9-0.6之间的所有xdata值放在xdataMulti[:,0]之间,-0.60之间的所有值放在{{1}中等等。

如何创建和填充xdataMulti[:,1](我事先知道我有多少范围及其端点,但我不知道每个范围内有多少xdata点,我必须遍历xdataMulti找出来的??

2 个答案:

答案 0 :(得分:2)

如果您的范围数量不是太大,您可以手动创建

 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]

其中f是你的scipy函数。

如果您的范围数量很大,您可以对数据进行排序然后使用 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]

请注意,这与第一个解决方案的不同之处在于您的范围将被排序。

如果您需要保留原始订单,可以使用间接排序

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 :(得分:1)

多维数组必须是矩形的,所以如果不是所有的行/列都具有相同的长度,那么你就不幸了。

然而,有办法解决这个问题。一种方法是创建list arrays

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

这不是一个多维数组,只是一个数组列表,但根据您的需要可能就足够了。