重塑numpy数组的列表,然后重塑b

2024-04-29 17:19:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由几个不同形状的numpy数组组成的列表。 我想把这个数组的列表重塑成一个numpy向量,然后改变向量中的每个元素,然后把它重塑回原来的数组列表。在

例如:

输入

[numpy.zeros((2,2)), numpy.ones((3,3))]
  • 第一个

到矢量

^{pr2}$
  • 第二个

每次只改变一个元素。例如,将第一个元素0更改为2

[0,2,0,0,1,1,1,1,1,1,1,1,1]
  • 最后

将其转换回

[array([[0,2],[0,0]]),array([[1,1,1],[1,1,1],[1,1,1]])]

有没有快速实施?非常感谢。在


Tags: numpy元素列表矢量oneszeros数组array
2条回答

似乎转换成一个列表然后再返回是没有效率的。相反,为什么不找出要索引哪个数组(以及在哪里),然后只更新该索引呢?e、 g

def change_element(arr1, arr2, ix, value):
    which = ix >= arr1.size
    arr = [arr1, arr2][which]
    ix = ix - arr1.size if which else ix
    arr.ravel()[ix] = value

下面是一些用法示例:

^{pr2}$

一些注意事项这会更新阵列。它不会创建新的数组。如果您真的需要创建新数组,我想您可以np.copy它们并返回。另外,这依赖于在ravel前后共享内存的数组。我不记得ravel将返回新数组而不是原始数组中的视图的确切情况。在


推广到更多的数组实际上是相当容易的。我们只需要遍历数组列表,看看ix是否小于数组大小。如果是的话,我们已经找到了我们的阵列。如果不是,我们需要从ix中减去数组的大小,以表示到目前为止我们已经遍历的元素数:

def change_element(arrays, ix, value):
    for arr in arrays:
        if ix < arr.size:
            arr.ravel()[ix] = value
            return
        ix -= arr.size

你可以称之为类似于之前的:

change_element([arr1, arr2], 6, 3.14159)

@mgilson可能会给你最好的答案,但是如果你必须先转换成一个简单的列表,然后再返回(也许因为你还需要对这个列表做些其他的事情),那么你可以用列表理解来做这件事:

lst = [numpy.zeros((2,4)), numpy.ones((3,3))]
tlist = [e for a in lst for e in a.ravel()]
tlist[1] = 2
i = 0
lst2 = []
dims = [a.shape for a in lst]
for n, m in dims:
    lst2.append(np.array(tlist[i:i+n*m]).reshape(n,m))
    i += n*m
lst2

[array([[ 0.,  2.],
    [ 0.,  0.]]), array([[ 1.,  1.,  1.],
    [ 1.,  1.,  1.],
    [ 1.,  1.,  1.]])]

当然,在展平时会丢失有关数组大小的信息,因此需要将它们存储在某处(在dims)中。在

相关问题 更多 >