Python 如何创建具有给定名称的n个数组?
我有一些三维数组,我想从每个数组中获取相同位置的值,然后将其复制到一个带有位置名称的数组中 例如,我有三个2x2x2数组,我想取每个矩阵的位置(1,1,1)处的值,并将其复制到一个名为111array的数组中。这个数组应该包含三个值 矩阵中的所有值和所有位置也应如此 我有一个for循环,它迭代一个数组中的所有值。但我不知道如何将结果以正确的方式保存到数组中,即数组名称显示位置号 我的第一个数组叫做b 范围内i的Python 如何创建具有给定名称的n个数组?,python,loops,numpy,matrix,Python,Loops,Numpy,Matrix,我有一些三维数组,我想从每个数组中获取相同位置的值,然后将其复制到一个带有位置名称的数组中 例如,我有三个2x2x2数组,我想取每个矩阵的位置(1,1,1)处的值,并将其复制到一个名为111array的数组中。这个数组应该包含三个值 矩阵中的所有值和所有位置也应如此 我有一个for循环,它迭代一个数组中的所有值。但我不知道如何将结果以正确的方式保存到数组中,即数组名称显示位置号 我的第一个数组叫做b 范围内i的(b.shape[0]): 对于范围内的j(b.形状[1]): 对于范围内的k(b.形
(b.shape[0]):
对于范围内的j(b.形状[1]):
对于范围内的k(b.形状[2]):
打印(b[i,j,k])
寻求帮助 看看这是不是你想要的。这是基于你的例子
import numpy as np
from itertools import product
a = np.arange(8).reshape(2,2,2)
b = a + 1
c = a + 2
indices = product(range(2), repeat=3)
all_arrays = []
for i in indices:
suffix = ''.join(map(str,i))
array_name = 'array'+suffix
value = np.array([a[i],b[i],c[i]])
exec(array_name+'= value')
exec(f'all_arrays.append({array_name})')
for name in all_arrays:
print(name)
print('\n')
print(all_arrays)
print('\n')
print(array111)
print('\n')
print(array101)
输出:
[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]
[5 6 7]
[6 7 8]
[7 8 9]
[array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4]), array([3, 4, 5]), array([4, 5, 6]), array([5, 6, 7]), array([6, 7, 8]), array([7, 8, 9])]
[7 8 9]
[5 6 7]
看看这是不是你想要的。这是基于你的例子
import numpy as np
from itertools import product
a = np.arange(8).reshape(2,2,2)
b = a + 1
c = a + 2
indices = product(range(2), repeat=3)
all_arrays = []
for i in indices:
suffix = ''.join(map(str,i))
array_name = 'array'+suffix
value = np.array([a[i],b[i],c[i]])
exec(array_name+'= value')
exec(f'all_arrays.append({array_name})')
for name in all_arrays:
print(name)
print('\n')
print(all_arrays)
print('\n')
print(array111)
print('\n')
print(array101)
输出:
[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]
[5 6 7]
[6 7 8]
[7 8 9]
[array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4]), array([3, 4, 5]), array([4, 5, 6]), array([5, 6, 7]), array([6, 7, 8]), array([7, 8, 9])]
[7 8 9]
[5 6 7]
看起来有人抢先给了我答案,但这里有另一种方法。我使用了一个字典来关联所有数组并从函数返回它
import numpy as np
b = np.array([0, 1, 2, 3, 4, 5, 6, 7])
b = np.reshape(b, (2, 2, 2))
print(b, type(b))
# [[[0 1],
# [2 3]],
# [[4 5],
# [6 7]]] <class 'numpy.ndarray'>
def myfunc(arr):
for i in range(b.shape[0]):
for j in range(b.shape[1]):
for k in range(b.shape[2]):
# Create a new array name from string parts.
name = "arr"+str(i)+str(j)+str(k)
print(name, b[i, j, k])
# Example: 'arr000', 0.
# Add a new key-value pair to the dictionary.
mydict.update({name: b[i,j,k]})
return(mydict)
mydict = {}
result = myfunc(b)
print(result)
# {'arr000': 0, 'arr001': 1, 'arr010': 2, 'arr011': 3, 'arr100': 4,
# 'arr101': 5, 'arr110': 6, 'arr111': 7}
# You would need to unpack the dictionary to use the arrays separately.
# use "mydict.keys()" to get all array names.
# "for key in keys" to loop through all array names.
# mydict['arr000'] will return the value 0.
将numpy导入为np
b=np.数组([0,1,2,3,4,5,6,7])
b=np.重塑(b,(2,2,2))
打印(b,类型(b))
# [[[0 1],
# [2 3]],
# [[4 5],
# [6 7]]]
def myfunc(arr):
对于范围内的i(b.形状[0]):
对于范围内的j(b.形状[1]):
对于范围内的k(b.形状[2]):
#从字符串部分创建新的数组名称。
name=“arr”+str(i)+str(j)+str(k)
打印(名称,b[i,j,k])
#示例:“arr000”,0。
#将新的键值对添加到字典中。
更新({name:b[i,j,k]})
返回(mydict)
mydict={}
结果=myfunc(b)
打印(结果)
#{'arr000':0,'arr001':1,'arr010':2,'arr011':3,'arr100':4,
#'arr101':5,'arr110':6,'arr111':7}
#您需要解包字典以单独使用数组。
#使用“mydict.keys()”获取所有数组名称。
#“for key in key”循环遍历所有数组名称。
#mydict['arr000']将返回值0。
您的问题标记为“numpy”,但不在代码段中使用它。如果您试图坚持使用numpy,还有另一种方法称为“结构化数据数组”。它类似于字典,因为“名称”和“值”可以作为成对集存储在numpy数组中。这保持了numpy高效的内存管理和快速计算(C优化)。如果您使用的是大型数据集,这一点很重要
另外,如果使用numpy,可能有一种方法可以在变量名中使用索引值
稍后,我会想出这两种方法的例子,并在可能的情况下更新我的答案。看起来有人比我抢先找到了答案,但这里有另一种方法。我使用了一个字典来关联所有数组并从函数返回它
import numpy as np
b = np.array([0, 1, 2, 3, 4, 5, 6, 7])
b = np.reshape(b, (2, 2, 2))
print(b, type(b))
# [[[0 1],
# [2 3]],
# [[4 5],
# [6 7]]] <class 'numpy.ndarray'>
def myfunc(arr):
for i in range(b.shape[0]):
for j in range(b.shape[1]):
for k in range(b.shape[2]):
# Create a new array name from string parts.
name = "arr"+str(i)+str(j)+str(k)
print(name, b[i, j, k])
# Example: 'arr000', 0.
# Add a new key-value pair to the dictionary.
mydict.update({name: b[i,j,k]})
return(mydict)
mydict = {}
result = myfunc(b)
print(result)
# {'arr000': 0, 'arr001': 1, 'arr010': 2, 'arr011': 3, 'arr100': 4,
# 'arr101': 5, 'arr110': 6, 'arr111': 7}
# You would need to unpack the dictionary to use the arrays separately.
# use "mydict.keys()" to get all array names.
# "for key in keys" to loop through all array names.
# mydict['arr000'] will return the value 0.
将numpy导入为np
b=np.数组([0,1,2,3,4,5,6,7])
b=np.重塑(b,(2,2,2))
打印(b,类型(b))
# [[[0 1],
# [2 3]],
# [[4 5],
# [6 7]]]
def myfunc(arr):
对于范围内的i(b.形状[0]):
对于范围内的j(b.形状[1]):
对于范围内的k(b.形状[2]):
#从字符串部分创建新的数组名称。
name=“arr”+str(i)+str(j)+str(k)
打印(名称,b[i,j,k])
#示例:“arr000”,0。
#将新的键值对添加到字典中。
更新({name:b[i,j,k]})
返回(mydict)
mydict={}
结果=myfunc(b)
打印(结果)
#{'arr000':0,'arr001':1,'arr010':2,'arr011':3,'arr100':4,
#'arr101':5,'arr110':6,'arr111':7}
#您需要解包字典以单独使用数组。
#使用“mydict.keys()”获取所有数组名称。
#“for key in key”循环遍历所有数组名称。
#mydict['arr000']将返回值0。
您的问题标记为“numpy”,但不在代码段中使用它。如果您试图坚持使用numpy,还有另一种方法称为“结构化数据数组”。它类似于字典,因为“名称”和“值”可以作为成对集存储在numpy数组中。这保持了numpy高效的内存管理和快速计算(C优化)。如果您使用的是大型数据集,这一点很重要
另外,如果使用numpy,可能有一种方法可以在变量名中使用索引值
稍后,我将考虑这两个方面的例子,并在可能的情况下更新我的答案。正如其他人所指出的,这似乎是一个奇怪的请求。但为了好玩,这里有一个简短的解决方案:
In [1]: import numpy as np
...: A = np.arange(8).reshape((2,2,2))
...: B = 10*A
...: C = 100*A
In [2]: A
Out[2]:
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
In [3]: D = np.concatenate((A[None], B[None], C[None]))
...: for (a,b,c) in np.ndindex((2,2,2)):
...: locals()[f'array{a}{b}{c}'] = D[:,a,b,c]
...:
In [4]: array000
Out[4]: array([0, 0, 0])
In [5]: array001
Out[5]: array([ 1, 10, 100])
In [6]: array010
Out[6]: array([ 2, 20, 200])
In [7]: array011
Out[7]: array([ 3, 30, 300])
In [8]: array100
Out[8]: array([ 4, 40, 400])
In [9]: array101
Out[9]: array([ 5, 50, 500])
In [10]: array110
Out[10]: array([ 6, 60, 600])
In [11]: array111
Out[11]: array([ 7, 70, 700])
正如其他人所指出的,这似乎是一个奇怪的要求。但为了好玩,这里有一个简短的解决方案:
In [1]: import numpy as np
...: A = np.arange(8).reshape((2,2,2))
...: B = 10*A
...: C = 100*A
In [2]: A
Out[2]:
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
In [3]: D = np.concatenate((A[None], B[None], C[None]))
...: for (a,b,c) in np.ndindex((2,2,2)):
...: locals()[f'array{a}{b}{c}'] = D[:,a,b,c]
...:
In [4]: array000
Out[4]: array([0, 0, 0])
In [5]: array001
Out[5]: array([ 1, 10, 100])
In [6]: array010
Out[6]: array([ 2, 20, 200])
In [7]: array011
Out[7]: array([ 3, 30, 300])
In [8]: array100
Out[8]: array([ 4, 40, 400])
In [9]: array101
Out[9]: array([ 5, 50, 500])
In [10]: array110
Out[10]: array([ 6, 60, 600])
In [11]: array111
Out[11]: array([ 7, 70, 700])
这真的不是个好主意。只需通过切片
a[:,1,1,1]
创建一个新数组,这个111array
命名约定在python中是无效的。有人能给我一个代码示例来说明如何做吗?这真的不是一个好主意。只需通过切片a[:,1,1,1]
创建一个新数组,这个111array
命名约定在python中是无效的。有人能给我一个如何做的代码示例吗?