对于数组b
中的每个子列表,返回列表a
中与b
子列表中的正布尔位置相同的值(即WHERE True)。
import pandas as pd
import numpy as np
a = pd.Series([1, 3, 5, 7, 9]) # values to choose from
b = np.array([[False, True, False, True, False], # based on bools
[False, False, False, False, False]])
out = []
for i, v in enumerate(b):
out.append([])
for j in range(len(e)):
if v[j]:
out[i].append(a[j])
out = np.array(out) # np.array([[3,7],[]]) # result
# In first sublist, True is on index 1 and 3 which corresponds to values 3 and 7.
# In second sublist, there is not True, hence empty.
上面的工作似乎太费力了,而且它可能没有使用 numpy 矢量化(它在处理大数据时速度很慢)。
3条答案
按热度按时间sshcrbum1#
您的
Series
是1d;b
是2d数组。Series
也有行索引,这是普通数组没有的。我们可以使用
b
的行,形状为(5,)的一维数组从a
中选择元素:由于各行产生不同的长度结果,我们不能一步完成该选择。
a[b]
给出错误,(5,)和(2,)之间不匹配。使用阵列版本的
a
可能更简单,也是1D,但没有行索引:应用一行
b
为以下各项编制索引:并对所有行反复执行此操作:
我们可以从
A
生成一个(2,5)数组,然后应用b
布尔掩码-但结果将是1D,没有任何迹象表明第二行没有选择任何内容:使用一行
b
或b
本身进行索引就是我所说的“完整数组”操作。但是不能单独使用b
的行;它需要进行一次Python级别的迭代。使用
A
和b
还有其他一些方法:乘法起作用,其中
b
被视为0和1的数组:还有一个
masked array
子类的数组:[105]数组列表可以转换为
object
dtype数组:这是1D,形状为(2,)。有时它是有用的,但在性能方面它并不是对列表的改进。
wqnecbli2#
您可以简单地使用:
输出:
[array([3, 7]), array([], dtype=int64)]
kxe2p93d3#
或者,只需使用数组b作为掩码,例如: