我有这个MATLAB代码需要转换为python,但是在firings数组中创建一个新列时会出现问题。在MATLAB中,代码创建了一个最初为空的n * 2矩阵,我希望能够在python中做同样的事情。使用NumPy,我创建了fired = np.where(v >= 30)
。然而,python创建一个元组而不是一个数组,因此它会抛出一个错误:
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
这是我在MATLAB中编写的代码,我想将其转换为Python
firings=[];
firings=[firings; t+0*fired, fired];
感谢帮助!谢谢!
答案 0 :(得分:1)
np.where
生成一个双元素元组。对于1D情况,您只需要访问np.where
结果的第一个元素:
fired = np.where(v >= 30)[0]
然后,您可以继续并连接矩阵。另外,user @Divakar提供的建议是使用np.flatnonzero
,它等效地找到NumPy数组中的非零值,并扁平化为1D数组,以减轻头痛:
fired = np.flatnonzero(v >= 30)
请注意,如果在fired
中找不到匹配项,则连接的逻辑将不起作用。当您查看连接逻辑时,您需要考虑这一点。 MATLAB的便利之处在于您能够连接空矩阵,结果没有效果(显然)。
另请注意,NumPy中没有行向量或列向量的概念。它只是一维数组。如果要特别强制数组成为列向量,则需要在第二维中引入单例轴,以便执行此操作。请注意,这仅在np.where
为您提供匹配结果时才有效。之后,您可以使用np.vstack
和np.hstack
来垂直和水平连接数组,以帮助您按照自己的要求进行操作。首先要做的是创建一个空白的2D数组,然后执行我们刚刚介绍的内容:
firings = np.array([[]]) # Create blank 2D array
# Some code here...
# ...
# ...
# fired = find(v >= 30); % From MATLAB
fired = np.where(v >= 30)[0]
# or you can use...
# fired = np.flatnonzero(v >= 30)
if np.size(fired) != 0:
fired = fired[:, None] # Introduce singleton axis
# Update firings with two column vectors
# firings = [firings; t + 0 * fired, fired]; % From MATLAB
firings = np.vstack([firings, np.hstack([t + 0*fired, fired])])
此处np.size
查找NumPy数组中的元素总数。如果np.where
的结果未生成任何结果,则fired
中的元素数应为0.因此,if
语句仅在v
中找到至少一个元素时才会执行受v >= 30
的约束。
答案 1 :(得分:0)
如果你使用numpy,你可以定义一个ndarray:
import numpy as np
firings=np.ndarray(shape=(1,2)
firings[0][0:]=(1.,2.)
firings=np.append(firings,[[3.,4.]],axis=0)