【发布时间】:2020-06-12 21:36:11
【问题描述】:
我在下面写了这个,但它看起来丑陋/笨拙。
有没有更好的方法在跟踪索引的同时遍历所有元素
(即跟踪我在哪个地址)并设置一个函数值
的索引?
如果我有更多维度,我可以想象这会变得更加丑陋。
应该有更好的方法来做到这一点。
import numpy as np
def f(i,j,k,l):
return i + 2 * j+ 3 * k + 4 * l
A = np.zeros((3,4,7,8), dtype=int)
i1 = i2 = i3 = i4 = -1
i1 = -1
for r1 in A:
i1 += 1
i2 = -1
for r2 in r1:
i2 += 1
i3 = -1
for r3 in r2:
i3 += 1
i4 = -1
for r4 in r3:
i4 += 1
v = f(i1, i2, i3, i4)
print ("Setting value {0} at ({1}, {2}, {3}, {4})".format(v, i1, i2, i3, i4))
A[i1, i2, i3, i4] = v
print(A)
【问题讨论】:
-
避免这种逐个元素过程的最佳方法。抽出一些时间阅读
numpy基础知识,了解它们的用途。 -
@hpaulj 好吧,我正在阅读,但我不知道我的来源是否很好。现在很难说哪些帖子好读。 Python 不是我的主要语言。如何避免?如果我希望该值成为索引的函数怎么办?能发个链接之类的吗?
-
我在想快速入门教程:numpy.org/doc/1.18/user/quickstart.html
-
如果
f是只接受标量索引值的通用函数,则没有捷径。有一些东西可以让循环更漂亮(比如np.ndenumerate),但没有任何东西可以让它更快。要正确使用numpy,您需要考虑使用整个索引数组的方法,而不仅仅是逐个元素。请记住,如果您必须一直这样迭代,那么所有后续使用的数组都会很慢。如果你必须这样做,numpy是错误的。
标签: python python-3.x numpy multidimensional-array