gpt4 book ai didi

arrays - python : append to numpy array

转载 作者:行者123 更新时间:2023-12-03 17:49:56 24 4
gpt4 key购买 nike

在某些情况下,原始的 numpy 数组需要被串联的 numpy 数组覆盖。我想讨论一个复杂结构化数组中的 numpy 数组的示例。这个问题是通过回答有关结构化数组的问题 https://stackoverflow.com/a/27563022/2062965 产生的.

import numpy as np
x = np.zeros(1, dtype = [('Table', float64, (2, 2)),
('Number', float),
('String', '|S10')])

# Append values to the array
print(np.append(x['Table'], array([[[1], [2]]]), axis=2))

# This assignment will lead to the error message mentioned below:
x['Table'] = np.append(x['Table'], array([[[1], [2]]]), axis=2)

类似问题

有几种解决方法,例如 numpy.appendnumpy.concatenatenumpy.vstacknumpy.hstack

它们中的每一个都创建一个新数组,不能通过返回如下错误消息将其分配回旧变量:

ValueError: could not broadcast input array from shape (1,2,3) into shape (1,2,2)

可能的方法

作为一个直接但耗时的解决方案,我可以定义一个新的空 numpy 数组,我用旧数据和应该追加的数据填充它。

也感谢您提供其他解决方案。

最佳答案

A numpy array 将其数据保存在固定大小的缓冲区中。类似 shape 的属性, stridesdtype用于解释该数据。这些属性可以更改,数据缓冲区中的值也可以更改。但是任何改变缓冲区大小的东西都需要一个副本。

append , concatenate等都创建一个新数组,并用原始数组中的数据填充它。

你的 append操作创建一个新的 (1,2,3)大批。它不能替代 (1,2,2) x 中的字节串缓冲区。

如果('Table', float64, (2, 2))('Table', object) 取代, 然后 x['Table']可以改变。那是因为x现在包含指向单独数组的指针。该赋值将一个指针替换为另一个指针,而不更改 x 的大小。缓冲。这就像更改字典的值,或替换列表中的嵌套列表。

为什么要尝试使用结构化数组而不是像 list 这样的传统 Python 结构? , dict或自定义类对象?

这是一个有效的序列:

In [116]: x = np.zeros(1, dtype = [('Table', 'O'),
('Number', np.float),
('String', '|S10')])

In [117]: x['Table'][0] = np.zeros((2,2),dtype=np.float64)

In [118]: x['Table'][0] = np.append(x['Table'][0], np.array([[[1], [2]]]))

In [119]: x
Out[119]:
array([([0.0, 0.0, 0.0, 0.0, 1.0, 2.0], 0.0, '')],
dtype=[('Table', 'O'), ('Number', '<f8'), ('String', 'S10')])

但请注意,我必须将新数组分配给 x['Table'][0] - “表格”字段中的“行”。

In [120]: x['Table']
Out[120]: array([array([ 0., 0., 0., 0., 1., 2.])], dtype=object)

x['Table']是另一个结构化数组。

回顾你的原创x定义,让我们给它 3 个“行”(元素):

In [132]: x = np.zeros(3, dtype = [('Table', np.float64, (2, 2)),
('Number', np.float),
('String', '|S10')])

In [133]: x
Out[133]:
array([([[0.0, 0.0], [0.0, 0.0]], 0.0, ''),
([[0.0, 0.0], [0.0, 0.0]], 0.0, ''),
([[0.0, 0.0], [0.0, 0.0]], 0.0, '')],
dtype=[('Table', '<f8', (2, 2)), ('Number', '<f8'), ('String', 'S10')])

In [134]: x['Table'].shape
Out[134]: (3, 2, 2)

x 的数据缓冲区是一系列浮点 0,散布着 10 个空白。当我要求 x['Table']它给了我 12 个 0 的非连续 View ,带有 (3,2,2)形状。

我可以更改该数组的元素:

In [137]: x['Table'][0,0,:]=[1,1]

但无论如何我都无法扩展它 - 除非创建一个新的 x数组。


另一种类似构造的结构是字典:

In [156]: x={'Table': np.zeros((1,2,2),dtype=np.float64),
'Number':np.zeros((1,)),
'String':['']}

In [157]: x
Out[157]:
{'Number': array([ 0.]),
'String': [''],
'Table': array([[[ 0., 0.],
[ 0., 0.]]])}

In [158]: x['Table'] =np.append(x['Table'],[1,2])

In [159]: x
Out[159]:
{'Number': array([ 0.]),
'String': [''],
'Table': array([ 0., 0., 0., 0., 1., 2.])}

从 CSV 文件读取时,像这样的复杂数据结构最有意义。例如

In [161]: dt = np.dtype([('Table', np.float64, (2, 2)),
('Number', np.float),
('String', '|S10')])

In [162]: txt="""0 0 0 0 0 astring
.....: 1 2 3 4 0 another
.....: 1 1 1 1 10 end
.....: """

In [163]: A=np.genfromtxt(txt.splitlines(),dtype=dt)

In [164]: A
Out[164]:
array([([[0.0, 0.0], [0.0, 0.0]], 0.0, 'astring'),
([[1.0, 2.0], [3.0, 4.0]], 0.0, 'another'),
([[1.0, 1.0], [1.0, 1.0]], 10.0, 'end')],
dtype=[('Table', '<f8', (2, 2)), ('Number', '<f8'), ('String', 'S10')])

genfromtxt读取行,将它们解析为列表的列表,并且仅在最后将它们打包到结构化数组中。

关于arrays - python : append to numpy array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27619678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com