2017-01-25 82 views
2

我有一个n值的n维1维阵列,可以称之为xdata如何创建多维numpy数组?

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

例如可以说

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

而且,我希望把xdataMulti[:,0]-0.9-0.6的扩展数据之间的所有值和-0.6之间的所有值和xdataMulti[:,1]0

怎么办我创建并填写了xdataMulti(我事先知道我有多少个范围以及他们的端点,但我不知道每个范围有多少个xdata点,我必须通过xdata来查找)?

+1

这算不上什么numpy的(多)维数组意味着!每个维度中条目的长度应该相同。 – Lagerbaer

+1

您正在描述不同大小的数组列表。 – hpaulj

+0

是的,它是一个不同大小的数组列表。我需要每个都是一个numpy数组,以便调用只接受numpy数组的scipy函数。 – user2175783

回答

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

中间代码* xs = np.sort(xdata) xbnd = np.searchsorted(xs,bnd) 范围= [xs [l:r]为l,r为zip(xbnd [: - 1],xbnd [1:])] result = [f(r)for r in ranges] *想象xbnd是[6,18],那么zip是[(6,18)],范围对象将只包含6和18(0到6和18之间,最后没有被选中)。 – JennyToy

+1

@JennyToy嗯,是不是应该如此?让xbnd从6开始意味着xdata中的最小六个值在最小仓边界之下,所以它们不应该存在仓,至少就原Q而言。如果你想收集这些异常值,你总是可以做一些事情,比如xbnd = np.r_ [0,xbnd,len(xdata)] –

1

多维数组必须是矩形的,所以如果不是所有行/列的长度都相同,那么您运气不好。

但是有办法解决这个问题。一种方法是创建arrayslist

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

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