英文:
Access each element of a multidimensional array without knowing the individual dimensions
问题
import numpy as np
import random
myRand = np.random.rand(5, 6, 7)
这段代码适用于已知myRand具有3个维度的情况。如果我不知道呢?
mySum = 0.0
for i in range(myRand.shape[0]):
for j in range(myRand.shape[1]):
for k in range(myRand.shape[2]):
# 对myRand[i,j,k]执行某些操作
英文:
I have a multidimensional array but I won't know the number of dimensions or the size of each dimension. How can I generalize the code such that I can access each element of the array individually?
import numpy as np
import random
myRand = np.random.rand(5, 6, 7)
#print (myRand.shape[0])
# This works great if I already know that myRand has 3 dimensions. What if I don't know that?
mySum = 0.0
for i in range(myRand.shape[0]):
for j in range(myRand.shape[1]):
for k in range(myRand.shape[2]):
# Do something with myRand[i,j,k]
答案1
得分: 1
如果您不需要在计算中保留每个维度内的索引,您可以只使用numpy.nditer
。
a = np.arange(8).reshape((2, 2, 2))
a
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
for i in np.nditer(a):
print(i)
# 输出结果:
0
1
2
3
4
5
6
7
您通常不应该需要像这样使用for循环迭代数组。通常使用numpy的方法来执行您要进行的计算会更好。
英文:
If you do not need to retain the indices within each of the dimensions for calculation, you can just use numpy.nditer
>>> a = np.arange(8).reshape((2, 2, 2))
>>> a
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> for i in np.nditer(a):
... print(i)
...
0
1
2
3
4
5
6
7
> You shouldn't really need to iterate over the array using a for-loop like this. There is usually a better way to perform whatever computation you are doing using numpy methods
答案2
得分: 1
你可以使用[itertools
][1]来完成这个任务。
以下是生成索引的代码,通过这些索引你可以访问数组中的元素:
import numpy as np
import itertools
v1 = np.random.randint(5, size=2)
v2 = np.random.randint(5, size=(2, 4))
v3 = np.random.randint(5, size=(2, 3, 2))
# v1
args1 = [list(range(e)) for e in list(v1.shape)]
print(v1)
for combination in itertools.product(*args1):
print(v1[combination])
# v2
args2 = [list(range(e)) for e in list(v2.shape)]
print(v2)
for combination in itertools.product(*args2):
print(v2[combination])
# v3
args3 = [list(range(e)) for e in list(v3.shape)]
print(v3)
for combination in itertools.product(*args3):
print(v3[combination])
在不同大小的简单数组上进行了测试,运行正常。
[1]: https://docs.python.org/2/library/itertools.html
<details>
<summary>英文:</summary>
You could use [`itertools`][1] to do so.
the following piece of code will generate the indices which you will be able to access the array while obtaining them:
import numpy as np
import itertools
v1 = np.random.randint(5, size=2)
v2 = np.random.randint(5, size=(2, 4))
v3 = np.random.randint(5, size=(2, 3, 2))
# v1
args1 = [list(range(e)) for e in list(v1.shape)]
print(v1)
for combination in itertools.product(*args1):
print(v1[combination])
# v2
args2 = [list(range(e)) for e in list(v2.shape)]
print(v2)
for combination in itertools.product(*args2):
print(v2[combination])
# v3
args3 = [list(range(e)) for e in list(v3.shape)]
print(v3)
for combination in itertools.product(*args3):
print(v3[combination])
Tested it on a simple arrays with different sizes and it works fine.
[1]: https://docs.python.org/2/library/itertools.html
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论