【发布时间】:2015-02-21 13:19:26
【问题描述】:
在某些情况下,原始 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.append、numpy.concatenate、numpy.vstack 或numpy.hstack。
他们每个人都创建了一个新数组,不能通过返回如下错误消息将其分配回旧变量:
ValueError: could not broadcast input array from shape (1,2,3) into shape (1,2,2)
可能的方法
作为一个直接但耗时的解决方案,我可以定义一个新的空 numpy 数组,我用旧数据和应该追加的数据填充它。
也感谢您提供其他解决方案。
【问题讨论】:
-
如果我理解 numpy 正确,它会将其数据放入连续的内存块中。所以我不确定 numpy 是否适合您的任务。您可能想查看 pytables (pytables.org),它专为处理分层数据而设计。
-
@Dietrich:我不太了解
numpy...尽管它没有直接回答问题,但请您详细说明一下吗?请记住:我不想将此数组写入文件(如 h5 或 txt)。它只是用于内部操作。 -
如果您的内部数据结构类似于链表(我不确定,但我认为 python 的列表是以这种方式实现的),则附加是有效的。如果你扩大一个 numpy 数组,它必须将你的数据复制到一个新的内存位置,因为它不能指望在其当前块后面找到空闲内存。所以我认为没有比你建议的更有效的方法 - 除非你使用不同的数据结构:根据数据大小,python list 或 dict 可能就足够了。对于大型数组(RAM 的重要部分),我建议使用 pytables 或数据库。
-
@Dietrich:如果我理解正确的话,在扩展列表时使用列表会更有效。您还建议使用 pytables 或数据库,但前提是它可能超出我的 RAM?我不想在这里讨论这个案例。
-
完全正确 - 我连续构建数组的标准策略是使用列表来完成,完成后将列表转换为 numpy 数组。根据我的经验,在大多数情况下,预分配足够大的块和移动原始数据(参见
numpy.getbuffer())所损失的速度可以忽略不计。
标签: arrays python-2.7 numpy