使用百分比拆分 Numpy ndarray 的最有效方法是什么?
What's the most efficient way to split up a Numpy ndarray using percentage?
嗨,我是 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]
part2: [3 1 2 4 5]
part3: [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))]
不过有几点需要注意
- 这是四舍五入的,因此您可以得到大约 20-60-20 的比例
- 你得到了一个元素列表,所以你可能不得不用
np.asarray()
重新numpyfy它们
- 您可以使用此方法为相同元素索引多个对象(例如标签和输入)
- 如果您在拆分之前获得一次索引 (
indices = list(range(a.shape[0]))
),您还可以对它们进行洗牌,从而同时处理数据洗牌
嗨,我是 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]
part2: [3 1 2 4 5]
part3: [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))]
不过有几点需要注意
- 这是四舍五入的,因此您可以得到大约 20-60-20 的比例
- 你得到了一个元素列表,所以你可能不得不用
np.asarray()
重新numpyfy它们
- 您可以使用此方法为相同元素索引多个对象(例如标签和输入)
- 如果您在拆分之前获得一次索引 (
indices = list(range(a.shape[0]))
),您还可以对它们进行洗牌,从而同时处理数据洗牌