使用百分比拆分Numpy ndarray的最有效方法是什么?

时间:2019-04-13 06:27:20

标签: python numpy numpy-ndarray

嗨,我是Python和Numpy的新手,我想问一下将ndarray分成3个部分的最有效方法是什么:20%,60%和20%

    import numpy as np
    row_indices = np.random.permutation(10)

让我们假设ndarray有10个项目: [7 9 3 1 2 4 5 6 0 8] 预期结果是将ndarray分成3个部分,例如part1,part2和part3。
第1部分: [7 9]
第2部分: [3 1 2 4 5]
第3部分: [0 8]

2 个答案:

答案 0 :(得分:0)

这是一种方法-

# data array
In [85]: a = np.array([7, 9, 3, 1, 2, 4, 5, 6, 0, 8])

# percentages (ratios) array
In [86]: p = np.array([0.2,0.6,0.2]) # must sum upto 1

In [87]: np.split(a,(len(a)*p[:-1].cumsum()).astype(int))
Out[87]: [array([7, 9]), array([3, 1, 2, 4, 5, 6]), array([0, 8])]

替代np.split

np.split在处理大数据时可能会变慢,因此,我们也可以在其中使用循环-

split_idx = np.r_[0,(len(a)*p.cumsum()).astype(int)]
out = [a[i:j] for (i,j) in zip(split_idx[:-1],split_idx[1:])]

答案 1 :(得分:0)

我通常只是寻求最明显的解决方案,尽管有很多更奇妙的方法可以做到这一点。实现需要花费一秒钟的时间,甚至不需要调试(因为它非常简单)

No appropriate parametric role variant available for 'Zipi'

一些注意事项

  1. 这是四舍五入的,因此您可以获得大约20-60-20分割的结果
  2. 您会返回一个元素列表,因此您可能必须使用part1 = [a[i, ...] for i in range(int(a.shape[0] * 0.2))] part2 = [a[i, ...] for i in range(int(a.shape[0] * 0.2), int(len(a) * 0.6))] part3 = [a[i, ...] for i in range(int(a.shape[0] * 0.6), len(a))] 重新对它们进行numpyfy
  3. 您可以使用此方法为同一元素索引多个对象(例如标签和输入)
  4. 如果在分割(np.asarray())之前一次获得索引,则还可以将它们进行混洗,从而同时处理数据混洗