根据数组计算过滤大型 2D numpy 数组
Filter large 2D numpy array based on array calculations
我有一个名为 DataSets
的二维 numpy.ndarray,其中包含超过 200 万个项目。看起来像这样...
[['1.3' '8.7' '2.4' ... 'a' '0' '0']
['1.5' '8.1' '2.7' ... 'a' '0' '0']
['1.9' '8.2' '2.0' ... 'c' '0' '0']
...
['1.2' '9.4' '2.5' ... 'b' '0' '0']
['0.9' '9.0' '2.3' ... 'a' '0' '0']
['1.1' '8.4' '2.8' ... 'd' '0' '0']]
我需要根据每行前 3 列的乘积结果过滤它,例如[0,0] * [0,1] * [0,2]
我正在尝试应用过滤器对其进行排序,但过滤器无法正常工作,因为引用需要索引。
filter_arr = float(DataSets[,0]) * float(DataSets[,1]) * float(DataSets[,2]) <= 25
FilteredDataSet = DataSets[filter_arr]
如果我添加索引,过滤器将无法正确过滤并将其转换为 3D 数组。如何修正过滤器以生成仅包含前 3 行的乘法结果 < 25 的行的二维数组?
这对你有用吗?
DataSets = np.array([
['1.3', '8.7', '2.4'],
['1.5', '8.1', '2.7'],
['1.9', '8.2', '2.0'],
['1.2', '9.4', '2.5'],
['0.9', '9.0', '2.3'],
['1.1', '8.4', '2.8'],
])
filter_arr = DataSets[:, 0].astype(float) * DataSets[:, 1].astype(float) * DataSets[:, 2].astype(float) <= 25
assert np.all(filter_arr == [False, False, False, False, True, False])
然后你可以写:
FilteredDataSet = DataSets[filter_arr]
assert np.all(FilteredDataSet == [['0.9', '9.0', '2.3']])
首先我建议使用 np.prod
而不是手动乘以你的值。之后你会得到一个一维布尔数组,你可以直接用它来过滤你的行。
import numpy as np
a = np.array([['1.3', '8.7', '2.4', 'a', '0', '0'],
['1.5', '8.1', '2.7', 'a', '0', '0'],
['1.9', '8.2', '2.0', 'c', '0', '0'],
['1.2', '9.4', '2.5', 'b', '0', '0'],
['1.1', '8.4', '2.8', 'd', '0', '0']])
filter = np.prod(a[:,0:3].astype(np.float), axis = 1) < 25
print(filter)
print(a[filter])
我有一个名为 DataSets
的二维 numpy.ndarray,其中包含超过 200 万个项目。看起来像这样...
[['1.3' '8.7' '2.4' ... 'a' '0' '0']
['1.5' '8.1' '2.7' ... 'a' '0' '0']
['1.9' '8.2' '2.0' ... 'c' '0' '0']
...
['1.2' '9.4' '2.5' ... 'b' '0' '0']
['0.9' '9.0' '2.3' ... 'a' '0' '0']
['1.1' '8.4' '2.8' ... 'd' '0' '0']]
我需要根据每行前 3 列的乘积结果过滤它,例如[0,0] * [0,1] * [0,2]
我正在尝试应用过滤器对其进行排序,但过滤器无法正常工作,因为引用需要索引。
filter_arr = float(DataSets[,0]) * float(DataSets[,1]) * float(DataSets[,2]) <= 25
FilteredDataSet = DataSets[filter_arr]
如果我添加索引,过滤器将无法正确过滤并将其转换为 3D 数组。如何修正过滤器以生成仅包含前 3 行的乘法结果 < 25 的行的二维数组?
这对你有用吗?
DataSets = np.array([
['1.3', '8.7', '2.4'],
['1.5', '8.1', '2.7'],
['1.9', '8.2', '2.0'],
['1.2', '9.4', '2.5'],
['0.9', '9.0', '2.3'],
['1.1', '8.4', '2.8'],
])
filter_arr = DataSets[:, 0].astype(float) * DataSets[:, 1].astype(float) * DataSets[:, 2].astype(float) <= 25
assert np.all(filter_arr == [False, False, False, False, True, False])
然后你可以写:
FilteredDataSet = DataSets[filter_arr]
assert np.all(FilteredDataSet == [['0.9', '9.0', '2.3']])
首先我建议使用 np.prod
而不是手动乘以你的值。之后你会得到一个一维布尔数组,你可以直接用它来过滤你的行。
import numpy as np
a = np.array([['1.3', '8.7', '2.4', 'a', '0', '0'],
['1.5', '8.1', '2.7', 'a', '0', '0'],
['1.9', '8.2', '2.0', 'c', '0', '0'],
['1.2', '9.4', '2.5', 'b', '0', '0'],
['1.1', '8.4', '2.8', 'd', '0', '0']])
filter = np.prod(a[:,0:3].astype(np.float), axis = 1) < 25
print(filter)
print(a[filter])