我可以使用np.resize来在数组中用np.nan进行填充吗?

8

a = np.array([[1, 2], [3, 4]])
a

array([[1, 2],
       [3, 4]])

接着使用resize函数

b = np.resize(a, (3, 3))
b

array([[1, 2, 3],
       [4, 1, 2],
       [3, 4, 1]])

b现在已经拥有了所有的来自a的信息,但顺序可能有些混乱。是否有一种方法可以利用这个信息创建一个看起来像左上角的矩阵,但现在有了一个新的列和一个新的行,值为np.nan?

c = np.empty(b.shape)
c.fill(np.nan)
c[:a.shape[0], :a.shape[1]] = a
c

array([[  1.,   2.,  nan],
       [  3.,   4.,  nan],
       [ nan,  nan,  nan]])

显然,上述代码实现了相同的功能。我只是不禁想到,可以使用resize以某种方式更高效地实现这一点。

相关链接:https://dev59.com/6mcs5IYBdhLWcg3wp1z3 - wim
“wonky order” 只是数据的重复副本(作为扁平化的)。c.resize 用0填充,但仍按扁平化顺序。两种形式的 resize 都不常用。 - hpaulj
1
你的最后一段代码并不低效。它可能有点冗长,但比起需要更多通用目的的“pad”函数来说,它更加高效。看看“np.resize”、“np.full”和“np.pad”的代码——它们都是用Python编写的。 - hpaulj
1个回答

11

或许可以看看pad函数:

>>> np.pad(a, ((0,1),(0,1)), 'constant', constant_values=np.nan)
array([[  1.,   2.,  nan],
       [  3.,   4.,  nan],
       [ nan,  nan,  nan]])

请注意,nan实际上是一个浮点数,因此如果尝试使用整数数据类型执行此操作,请小心。您可能更喜欢使用掩码数组。

6
事实上,我不得不使用np.pad(a.astype(float)... - piRSquared
确认它不适用于int数据类型(您会得到一个大的负整数值),我很高兴您提到了需要使用float。 - David Parks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接