【问题标题】:Efficiently append an element to each of the lists in a large numpy array有效地将元素附加到大型 numpy 数组中的每个列表
【发布时间】:2021-02-02 18:43:19
【问题描述】:

我有一个非常大的列表数组,我想将一个元素附加到每个数组。为了性能,我想避免使用循环。

以下语法无效。

a=np.array([[],[1],[0,1]])

[j.append(3) for j in a]

这个例子的预期结果是

np.array([[3],[1,3],[0,1,3]) 

但我得到了

[None, None, None]

有什么线索吗?

【问题讨论】:

  • 真的 np.array 在不同大小的列表上不会让你有太大的改进,如果有任何超过香草 python。
  • Noneappend 的输出。但是如果你检查a,你会发现它已经动态变化了。
  • 为什么numpy.ndarray 中有python list 对象?这真的没有意义。请注意,不要将列表理解用于副作用,[j.append(3) for j in a] 会给您[None, None, None],因为j.append(r)总是返回None,但请注意,@987654334 中的原始列表@应该被修改。但不要这样做,使用常规循环。更好的是,不要使用 numpy.ndarray 列表。
  • 对象 dtype 数组上的迭代比列表上的迭代要慢一些。但两者都比迭代二维数组的行要快。

标签: python performance numpy memory


【解决方案1】:

list.append() 返回 None,所以您只是看到 3 个附加操作均返回 None

但是,如果您打印a 的内容,您会发现追加成功。

a=np.array([[],[1],[0,1]])
[j.append(3) for j in a]
print(a)
# prints "[list([3]) list([1, 3]) list([0, 1, 3])]"

我不建议对任何东西使用一个 numpy 列表数组,但也许你有一些特殊的用例,这是有意义的。我建议问一个单独的问题,看看使用 numpy 列表数组的原因

【讨论】:

  • 非常感谢!为什么你“不建议对任何东西使用一个 numpy 列表数组”?
  • @zell 因为这毫无意义。为什么你使用一个 numpy.ndarray 列表?它有什么优势?
  • @zell 是的,拥有一个列表数组确实没有任何好处。
  • @Michael @ juanpa.arrivillaga 好点。实际上,我遇到了大型数组列表的内存问题。如果我要表示一个大型数组,其中每个项目都是未知数量的整数,那么有什么好的选择?
  • @zell 你最好提出一个新问题,如果没有适当的上下文很难给出答案
猜你喜欢
  • 2020-03-31
  • 2017-03-03
  • 2020-07-07
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多