【问题标题】:Can I use np.resize to pad an array with np.nan我可以使用 np.resize 用 np.nan 填充数组吗
【发布时间】:2016-12-20 23:49:10
【问题描述】:

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 的所有信息(如果顺序不正确)。有没有办法利用它在左上角创建一个看起来像 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 可以以某种方式更有效地完成此任务。

【问题讨论】:

  • wonky order 只是数据的重复副本(已展平)。 c.resize 用 0 填充,但再次按扁平顺序。 resize 的两种形式都没有得到太多使用。
  • 你最后的代码不是低效的。它可能有点罗嗦,但它比pad 更有效,后者必须更通用。查看np.resizenp.fullnp.pad 的代码——这些都是用Python 编写的。

标签: python numpy


【解决方案1】:

也许看看pad

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

请注意,nan 实际上是一个浮点数,因此在尝试使用整数 dtype 时要小心。您可能更喜欢使用掩码数组。

【讨论】:

  • 其实我不得不用np.pad(a.astype(float)...
  • 确认它不适用于 int 数据类型(您会得到一个较大的负 int 值),很高兴您提到了 float 的必要性。
猜你喜欢
  • 2016-12-07
  • 2019-04-13
  • 2019-12-03
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多