尝试将MATLAB数组转换为Python数组
我有这个需要翻译成python的MATLAB代码,但是在firings数组中创建一个新列时有一个问题。在MATLAB中,代码创建了一个最初为空的n*2矩阵,我希望在python中也能这样做。使用NumPy,我创建了尝试将MATLAB数组转换为Python数组,python,arrays,matlab,numpy,Python,Arrays,Matlab,Numpy,我有这个需要翻译成python的MATLAB代码,但是在firings数组中创建一个新列时有一个问题。在MATLAB中,代码创建了一个最初为空的n*2矩阵,我希望在python中也能这样做。使用NumPy,我创建了fired=np.where(v>=30)。但是,python会创建元组而不是数组,因此会抛出错误: TypeError: unsupported operand type(s) for +: 'int' and 'tuple' 这是我在MATLAB中的代码,我想将其转换为Pytho
fired=np.where(v>=30)
。但是,python会创建元组而不是数组,因此会抛出错误:
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
这是我在MATLAB中的代码,我想将其转换为Python
firings=[];
firings=[firings; t+0*fired, fired];
谢谢你的帮助!谢谢 如果使用numpy,可以定义一个数据数组:
import numpy as np
firings=np.ndarray(shape=(1,2)
firings[0][0:]=(1.,2.)
firings=np.append(firings,[[3.,4.]],axis=0)
如果数组本质上是1D,则生成两元素元组。对于1D情况,您需要访问np结果的第一个元素。其中
仅:
fired = np.where(v >= 30)[0]
然后可以继续并连接矩阵。另外一个由提供的建议是,使用它可以等效地在NumPy数组中查找非零值,并将其展平为1D数组,以减少麻烦:
fired = np.flatnonzero(v >= 30)
请注意,如果在激发的中未找到匹配项,则连接逻辑将不起作用。在查看连接逻辑时,需要考虑这一点。MATLAB的便利之处在于,可以将空矩阵串联在一起,结果没有任何影响(显然)
还要注意的是,NumPy中没有行向量或列向量的概念。它只是一个一维数组。如果您想特别强制数组成为现有的列向量,则需要在第二维度中引入一个单子轴,以便执行此操作。请注意,这仅在np.where
提供匹配结果的情况下有效。之后,您可以使用和垂直和水平连接数组,以帮助您完成所需的操作。您首先要做的是创建一个空白的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])])
此处查找NumPy数组中的元素总数。如果np.where
的结果未生成任何结果,则中激发的元素数应为0。因此,if
语句仅在我们在v
中找到至少一个受v>=30
约束的元素时执行,您到底是在使用NumPy,还是在使用vanilla Python?而且,错误是非常直接的fired
是一个元组
,您正在尝试向元组添加一个整数。这个操作在普通Python中是未定义的。我使用的是NumPy。Fired的值来自:Fired=np。其中(v>=30),其中v是一个n*1向量。如何确保将fired添加到firing中?np.flatnonzero
对于1D
情况可能更具表现力。@Divakar aha,用np.where
替换它。当然