制作一个3D数组,其中每个项目引用Python中的当前行、列和项目
我试图制作一个3D数组,其中每个元素都引用当前的行、列和项。因此,如果我有制作一个3D数组,其中每个项目引用Python中的当前行、列和项目,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,我试图制作一个3D数组,其中每个元素都引用当前的行、列和项。因此,如果我有x=[0,1],y=[0,1,2]和项=['a','b'],我希望输出是 arr = [ [ [00a, 10a], [01a, 11a], [02a, 12a] ], [ [00b, 10b], [01b, 11b], [02b, 12b] ]] 我知道这可以很容易地用三重循环来完成 for i in range(len(x)): for j in range(len(y)): for it in ran
x=[0,1]
,y=[0,1,2]
和项=['a','b']
,我希望输出是
arr = [ [ [00a, 10a], [01a, 11a], [02a, 12a] ],
[ [00b, 10b], [01b, 11b], [02b, 12b] ]]
我知道这可以很容易地用三重循环来完成
for i in range(len(x)):
for j in range(len(y)):
for it in range(len(item)):
arr[i,j,it] = str(i)+str(j)+it
但是有没有更优雅的方法来实现这一点,例如使用一些numpy命令?谢谢 您可以使用列表理解:
arr=[[[f'{i}{j}{k}' for k in item]for j in y]for i in x]
输出:
arr
[[['00a', '00b'], ['01a', '01b'], ['02a', '02b']],
[['10a', '10b'], ['11a', '11b'], ['12a', '12b']]]
array([[['00a', '00b'],
['01a', '01b'],
['02a', '02b']],
[['10a', '10b'],
['11a', '11b'],
['12a', '12b']]], dtype='<U3')
使用
itertools
和numpy
的其他选项:
import itertools
import numpy as np
prod=itertools.product(x,y,item)
prod=list(map(lambda x: f'{x[0]}{x[1]}{x[2]}',prod))
np.array(prod).reshape(len(x),len(y),len(item))
输出:
arr
[[['00a', '00b'], ['01a', '01b'], ['02a', '02b']],
[['10a', '10b'], ['11a', '11b'], ['12a', '12b']]]
array([[['00a', '00b'],
['01a', '01b'],
['02a', '02b']],
[['10a', '10b'],
['11a', '11b'],
['12a', '12b']]], dtype='<U3')
数组(['00a',00b'],
[01a',01b'],
[02a',02b']],
[10a',10b'],
[11a',11b'],
['12a','12b']]],dtype='您可以使用列表理解:
arr=[[[f'{i}{j}{k}' for k in item]for j in y]for i in x]
输出:
arr
[[['00a', '00b'], ['01a', '01b'], ['02a', '02b']],
[['10a', '10b'], ['11a', '11b'], ['12a', '12b']]]
array([[['00a', '00b'],
['01a', '01b'],
['02a', '02b']],
[['10a', '10b'],
['11a', '11b'],
['12a', '12b']]], dtype='<U3')
使用itertools
和numpy
的其他选项:
import itertools
import numpy as np
prod=itertools.product(x,y,item)
prod=list(map(lambda x: f'{x[0]}{x[1]}{x[2]}',prod))
np.array(prod).reshape(len(x),len(y),len(item))
输出:
arr
[[['00a', '00b'], ['01a', '01b'], ['02a', '02b']],
[['10a', '10b'], ['11a', '11b'], ['12a', '12b']]]
array([[['00a', '00b'],
['01a', '01b'],
['02a', '02b']],
[['10a', '10b'],
['11a', '11b'],
['12a', '12b']]], dtype='<U3')
数组(['00a',00b'],
[01a',01b'],
[02a',02b']],
[10a',10b'],
[11a',11b'],
['12a','12b']]],dtype='下面是另一个使用numpy的不带循环的解决方案:
import numpy as np
x=np.array([0,1]).astype(str)
y=np.array([0,1,2]).astype(str)
items=np.array(['a','b'])
temp= np.core.defchararray.add(y[:,np.newaxis], items)
result = np.core.defchararray.add(x[:,np.newaxis,np.newaxis], temp)
print(result)
输出:
[[['00a' '00b']
['01a' '01b']
['02a' '02b']]
[['10a' '10b']
['11a' '11b']
['12a' '12b']]]
下面是另一个使用numpy的不带循环的解决方案:
import numpy as np
x=np.array([0,1]).astype(str)
y=np.array([0,1,2]).astype(str)
items=np.array(['a','b'])
temp= np.core.defchararray.add(y[:,np.newaxis], items)
result = np.core.defchararray.add(x[:,np.newaxis,np.newaxis], temp)
print(result)
输出:
[[['00a' '00b']
['01a' '01b']
['02a' '02b']]
[['10a' '10b']
['11a' '11b']
['12a' '12b']]]
我不知道numpy是否有这样一个命令,但是如果你想获得更好的性能,你也可以使用列表理解。你想改进什么?@wwii我想知道是否有更简单的方法来实现这一点,最好是使用更少的行数。@NOBODY33先生已经使用列表理解相关:,-给了你答案搜索替换嵌套for循环的解决方案为什么没有一个搜索结果是可接受的。?我不知道numpy是否有这样的命令,但如果您想要更好的性能,您也可以使用列表理解。您想改进什么?@wwii我想知道是否有更简单的方法来完成此操作,最好是可以做的事情行数较少的ne。@MrNobody33使用列表理解相关:,-给了您答案。-当您搜索替换嵌套for循环的解决方案时,为什么没有一个搜索结果是可接受的。?根据我的经验defchararray
函数速度不快。它们仍然使用python字符串方法,每次一个元素。在我的经验中edefchararray
函数速度不快。它们仍然使用python字符串方法,一次一个元素。