我有一个带有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.6
和0
之间的所有值放在{{1}中等等。
如何创建和填充xdataMulti[:,1]
(我事先知道我有多少范围及其端点,但我不知道每个范围内有多少xdata点,我必须遍历xdataMulti
找出来的??
答案 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])]
这不是一个多维数组,只是一个数组列表,但根据您的需要可能就足够了。