我正在尝试将np.fromfunction
与np.exp
和np.complex
结合使用,通过对两个现有(实值)数组中的值起作用的数学表达式来生成复值数组。这不符合我的预期:
import numpy as np
A = np.arange(30).reshape(10,3)
B = np.arange(60).reshape(20,3)
C = np.fromfunction(lambda i,k,l: np.exp(np.complex(0,A[i,l]*B[k,l])), shape=(len(A[:,0]),len(B[:,0]),3), dtype=int)
TypeError: only size-1 arrays can be converted to Python scalars
因此,我了解到np.fromfunction()
生成了一个常规numpy.array
,它不能采用复杂的值,而且似乎无法告诉该函数假定dtype=complex
({{1 }}参数是指变量dtype
)。相反,我尝试将复指数计算为一个包含所有实数值的数组和一个包含所有虚数值的数组(不使用复数形式):
i,k,l
到目前为止,太好了。现在,我希望将它们组合为一个预定义的复杂数组:
C = np.fromfunction(lambda i,k,l: np.cos(A[i,l]*B[k,l]), shape=(len(A[:,0]),len(B[:,0]),3), dtype=int)
D = np.fromfunction(lambda i,k,l: np.sin(A[i,l]*B[k,l]), shape=(len(A[:,0]),len(B[:,0]),3), dtype=int)
此操作失败,因为E = np.zeros(np.shape(C), dtype=np.complex)
E = np.complex(C,D)
TypeError: only length-1 arrays can be converted to Python scalars
似乎需要标量输入。我需要A)一种从作用在两个现有数组上的数学表达式生成复值数组的方法,或者B)填充np.complex()
以便每个元素E
包含{{1 }} 无诉诸于遍历整个数组。或者C)我尚未想到的其他一些巧妙的解决方案。
我正在使用numpy版本1.17.2。
编辑:以下修改可以完成这项工作:
E[i,k,l]
即将呼叫移至np.complex(C[i,k,l], D[i,k,l])
之外的C = np.fromfunction(lambda i,k,l: np.exp(np.complex(0,1)*A[i,l]*B[k,l])), shape=len(A[:,0]),len(B[:,0]),3, dtype=int)
和A[i,l]
。