我有一个空字符串列表:
test = ['foo', '', 'bar', '', 'baz']
以下代码将去除空字符串并返回所需的输出:
list(filter(None, test))
Out:['foo', 'bar', 'baz']
当我将列表变成一个numpy数组时,通过映射应用相同的功能不起作用:
test = np.array(['foo', '', 'bar', '', 'baz'], dtype='<U15')
def g(x):
return list(filter(None, x))
def array_map(x):
return np.array(list(map(g, x)))
array_map(test)
Out: array([list(['f', 'o', 'o']), list([]), list(['b', 'a', 'r']), list([]),
list(['b', 'a', 'z'])], dtype=object)
为什么会发生这种情况?从numpy数组中删除空字符串的正确,简单方法是什么?
当我将列表变成一个numpy数组时,通过映射应用相同的功能不起作用
对; 该函数已经将您的源序列变成了您要从中组成数组的列表,因此没有理由进行任何映射。
为什么会这样
映射g
到与的每个元素分别调用的test
均值。的元素是字符串;当与被评估与所述串中的一个,在迭代的字符的字符串。所有这些字符都通过过滤器,因此制作了一个包含它们的字符。因此,的ped版本包含一堆字符列表,然后将其传递给。g
x
test
list(filter(None, x))
x
test
filter
list
map
test
np.array
什么是从numpy数组中删除空字符串的正确,简单方法?
好吧,如果你想做到这一点的filter
,它看起来像numpy的阵列传递到一个单一的调用filter
从结果,然后再构建一个新的阵列。只有,生成的filter
对象不会被所自动迭代np.array
,因此您必须首先创建一个列表。从而:
>>> np.array(list(filter(None, test)), dtype='<U15')
array(['foo', 'bar', 'baz'], dtype='<U15')
(请注意,dtype
如果需要保留,则需要明确指定需求;否则,Numpy将推断出足以满足数据需求的最小类型。)
但是,最好将Numpy工具用于此任务。从数组中删除数据的惯用方式是创建一个与所需元素匹配的掩码,并为此进行索引:
>>> test[test != '']
array(['foo', 'bar', 'baz'], dtype='<U15')
(如果您想删除所有虚假的东西(即不能满足if
条件的东西),则可以使用有点笨拙的命名nonzero
方法:test[test.nonzero()]
。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句