【问题标题】:numpy.resize() rearanging instead of resizing?numpy.resize() 重新排列而不是调整大小?
【发布时间】:2014-06-02 05:53:24
【问题描述】:

我正在尝试调整 numpy 数组的大小,但似乎调整大小的工作方式是首先展平数组,然后获取第一个 X*Y elem 并将它们放入新的形状。我想要做的是在坐标 3,3 处切割阵列,而不是重新排列它。当我尝试将其放大到 7,7 时会发生类似的事情......而不是“重新排列”我想用零填充新的列和行并保持数据不变。 有没有办法做到这一点?

> a = np.zeros((5,5))
> a.flat = range(25)
> a
array(
  [[  0.,   1.,   2.,   3.,   4.],
   [  5.,   6.,   7.,   8.,   9.],
   [ 10.,  11.,  12.,  13.,  14.],
   [ 15.,  16.,  17.,  18.,  19.],
   [ 20.,  21.,  22.,  23.,  24.]])

> a.resize((3,3),refcheck=False)
> a
array(
  [[ 0.,  1.,  2.],
   [ 3.,  4.,  5.],
   [ 6.,  7.,  8.]])

谢谢...

【问题讨论】:

  • 你能发布一个预期输出的例子吗?

标签: python arrays numpy resize


【解决方案1】:

我相信你想使用 numpy 的切片语法而不是 resizeresize 的工作原理是首先分解数组并使用一维视图。

>>> a = np.arange(25).reshape(5,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> a[:3,:3]
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12]])

您在这里所做的是查看 numpy 数组。例如通过切片更新原始数组:

>>> a[:3,:3] = 0
>>> a
array([[ 0,  0,  0,  3,  4],
       [ 0,  0,  0,  8,  9],
       [ 0,  0,  0, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

可以在here 找到关于 numpy 切片语法的优秀指南。

升迁(或填充)只能通过复制数据来实现。你从一个零数组开始并适当地填写

upsized = np.zeros([7, 7])
upsized[:5, :5] = a

【讨论】:

  • 您可能需要在答案中添加升迁部分以完成它
  • @eickenberg 你似乎理解了问题的一部分,结合我们可能已经准确地猜到了提问者想要什么。
【解决方案2】:

升级到 7x7 是这样的

upsized = np.zeros([7, 7]) 
upsized[:5, :5] = a

【讨论】:

  • 谢谢,这正是我所需要的。你不会知道如何就地做到这一点吧?
  • 如果您的原始数据 a 是按照您的方式创建的,则无法执行此操作。这是因为np.ndarray 数据在内存中始终必须是连续的,并且您无法知道是否有足够的空间将额外的 24 个插槽添加到 a 已经占用的 25 个插槽中,以便为 49=7x7 连续数字腾出空间在记忆中。但是,如果您在内存中预先分配了 49 个空间,那么您可以进行就地编辑。例如。 b=upsized[:5, :5] 是相同数据的视图(没有副本!)作为 upsized 并且其内容等于 a,但它不再是相同的数组。
  • 我怀疑它会是这样的......你是对的,它可能将数组存储在连续的空间中
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多