将 * 可变长度 * 列表的Python序列隐式转换为NumPy数组会导致该数组的类型为 object。
v = [[1], [1, 2]]
np.array(v)
>>> array([[1], [1, 2]], dtype=object)
尝试强制另一种类型将导致异常:
np.array(v, dtype=np.int32)
ValueError: setting an array element with a sequence.
通过用给定的占位符填充“缺失”值,获得int32类型的密集NumPy数组的最有效方法是什么?
从我的样本序列v
中,如果0是占位符,我想得到如下内容
array([[1, 0], [1, 2]], dtype=int32)
8条答案
按热度按时间6qftjkof1#
您可以使用itertools.zip_longest:
注意:对于Python 2,它是itertools.izip_longest。
tyky79it2#
这里是一个几乎 * 矢量化的基于布尔索引的方法,我在其他几篇文章中使用过-
样本运行
运行时测试
在本节中,我将对
DataFrame-based solution by @Alberto Garcia-Raboso
,itertools-based solution by @ayhan
进行计时,因为它们似乎可以很好地扩展,并且本文中基于布尔索引的数据集相对较大,列表元素之间的大小变化有三个级别。案例1:尺寸变化较大
案例2:较小的尺寸变化
案例#3:每个列表元素的元素数量更大(最大100)
对我来说,似乎
itertools.izip_longest
做得很好!没有明确的赢家,但必须采取在个案的基础上!bvuwiixz3#
Pandas和它的
DataFrame
-s很好地处理了丢失的数据。frebpwbc4#
bhmjp9jg5#
这里是一个一般的方法:
s1ag04yj6#
你可以尝试先转换pandas Dataframe ,然后再转换成numpy数组
ds97pgxw7#
我对 Alexandria 的答案有一个 numpy 广播错误,所以我用numpy.pad添加了一个小的变化:
wr98u20j8#
如果你想将相同的逻辑扩展到更深的层次(列表的列表的列表,..),你可以使用tensorflow不规则的Tensor并转换为Tensor/数组。例如:
这将创建一个填充0的数组。或者一个更深层次的例子: