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

2024-05-23 14:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我是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] 预期结果是将数据集分为第1部分、第2部分和第3部分。
第1部分:[7 9]
第2部分:[3 1 2 4 5]
第3部分:


Tags: 数据方法importnumpyasnprandomrow
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))]

但有几件事需要注意

  1. 这是四舍五入的,因此你可以得到一个大概只有20-60-20分的结果
  2. 返回元素列表,因此可能需要使用np.asarray()重新计算它们
  3. 可以使用此方法为同一元素的多个对象(例如标签和输入)编制索引
  4. 如果您在分割(indices = list(range(a.shape[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:])]

相关问题 更多 >