【问题标题】:reshape numpy arrays in iterator在迭代器中重塑 numpy 数组
【发布时间】:2018-04-13 22:01:58
【问题描述】:

假设我有一个 numpy 数组列表。如何重塑列表中的数组?
这是一个示例,我想确保我的所有数组都有两个维度:

In [0]: import numpy as np
   ...: arr1 = np.array([1, 2, 3]) # Shape is (3,) --> Will need reshaping
   ...: arr2 = np.array([[1, 2, 3]]) # Shape is (1, 3) --> Shape ok
   ...: list_of_arrays = [arr1, arr2]
   ...: for i, arr in enumerate(list_of_arrays):
   ...:     print("\narray number {}, initial shape: {}".format(i, arr.shape))
   ...:     if len(arr.shape)==1:
   ...:         print("needs reshaping")
   ...:         arr = np.reshape(arr, (1, arr.shape[0]))
   ...:         print("new shape: {}".format(arr.shape))
   ...:     else:
   ...:         print("shape ok")

按预期打印出来:

array number 0, initial shape: (3,)
needs reshaping
new shape: (1, 3)

array number 1, initial shape: (1, 3)
shape ok  

但是,结果被强制转换为arr,而不是我真正要修改的数组,arr1

In [1]: arr1.shape
Out[1]: (3,)

如何将结果转换为arr1

请注意,我需要修改列表中的元素,而不是列表本身。换句话说,我希望能够直接修改arr1:它将作为arr1 的参数传递,而不是list_of_arrays[0]

【问题讨论】:

  • 结果被转换为arr,而不是你真正想要重塑的数组。
  • 没错。那么如何转换到我真正想要重塑的数组呢?我将更改我的文字以反映此评论。
  • list_of_arrays = list(map(np.atleast_2d, list_of_arrays)) 是一个选项 :) 例如显式映射结果。当然,如果想要的维度不同,也可以使用 lambda 函数代替 np.atleast_2d 来达到想要的结果。
  • 我需要修改列表中的元素,而不是列表本身。换句话说,我希望能够直接修改arr1:它将作为arr1 的参数传递,而不是list_of_arrays[0]。编辑问题以使其更清楚。
  • 如果参数是临时的arr,又不想将其转换回来,为什么不直接将它传递给你想在for循环中使用它执行的函数呢?

标签: python numpy iterator reshape


【解决方案1】:

这是一个基本的数组迭代问题。

for i in alist:
   i = ...

在循环内重新分配i,因此不会影响源列表。您必须对 i 自身进行变异,或者为列表编制索引。

In [552]: arr1 = np.array([1, 2, 3]) # Shape is (3,) --> Will need reshaping
     ...: arr2 = np.array([[1, 2, 3]]) # Shape is (1, 3) --> Shape ok
     ...: list_of_arrays = [arr1, arr2]
     ...: for i, arr in enumerate(list_of_arrays):
     ...:    if len(arr.shape)==1:
     ...:        list_of_arrays[i] = np.reshape(arr, (1, arr.shape[0])) 
In [553]: list_of_arrays
Out[553]: [array([[1, 2, 3]]), array([[1, 2, 3]])]

reshape 创建一个数组的新视图,但可以就地修改形状:

 In [554]: arr1 = np.array([1, 2, 3]) # Shape is (3,) --> Will need reshaping
     ...: arr2 = np.array([[1, 2, 3]]) # Shape is (1, 3) --> Shape ok
     ...: list_of_arrays = [arr1, arr2]
     ...: for arr in list_of_arrays:
     ...:    if len(arr.shape)==1:
     ...:        arr.shape = (1, arr.shape[0])

但创建新列表通常更容易,甚至可能更快。例如np.vstack 使用

alist = [np.atleast_2d(arr) for arr in list_of_arrays]

确保所有输入数组都是二维的。像这样的列表推导在 Python 中被广泛使用。 list(map(np.atleast_2d, list_arrays)) 是等价的,但在我看来不太可读。

【讨论】:

  • "reshape 创建了一个数组的新视图,但形状可以就地修改"==>这正是我想要的正是
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2011-10-01
  • 2019-05-05
相关资源
最近更新 更多