嗨,我是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]
这是一种方式 -
# 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:])]
我通常只是寻求最明显的解决方案,尽管有更多更好的方法可以做到这一点。它需要一秒钟才能实现,甚至不需要调试(因为它非常简单)
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))]
但要注意的一些事情
np.asarray()
重新调整它们indices = list(range(a.shape[0]))
),你也可以改变它们,从而同时处理数据改组