试图将MATLAB数组转换为Python数组

时间:2017-05-05 16:33:00

标签: python arrays matlab numpy

我有这个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];

感谢帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

如果数组本质上是1D,则

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.vstacknp.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)