2017-05-05 100 views
1

我有这个MATLAB代码,我需要翻译成python,但在创建一个新的列在发射阵列中有一个问题。在MATLAB中,代码创建了一个最初为空的n * 2矩阵,我希望能够在python中执行相同的操作。使用NumPy,我创建了fired = np.where(v >= 30)。然而蟒蛇创建一个元组,而不是一个阵列,它抛出一个错误:试图将一个MATLAB数组转换为一个Python数组

TypeError: unsupported operand type(s) for +: 'int' and 'tuple' 

这是我在MATLAB代码,我想转换成Python

firings=[]; 
firings=[firings; t+0*fired, fired]; 

帮助表示赞赏!谢谢!

+0

您是否在使用NumPy,还是仅仅使用香草Python?另外,这个错误非常直截了当。 ''''''是一个'元组',并且你正试图给一个元组添加一个整数。这个在vanilla Python中的操作是未定义的。 – rayryeng

+0

我正在使用NumPy。被解雇的价值来自:fired = np.where(v> = 30),其中v是一个n * 1向量。我如何确保发射被添加到发射? –

回答

1

np.where生成二维元件的元组,如果数组1D的性质。对于一维的情况下,你需要访问的只有np.where结果的第一个元素:

fired = np.where(v >= 30)[0] 

然后,您可以继续前进,拼接矩阵。还通过user @Divakar提供一个建议是使用np.flatnonzero这将等效找到非零值在NumPy的阵列和展平为一维阵列,用于以下头痛:

fired = np.flatnonzero(v >= 30) 

请注意该逻辑来连接不会如果fired中找不到匹配项,则工作。当您查看连接逻辑时,您需要考虑这一点。使用MATLAB的方便之处在于,您可以连接空矩阵,结果是无效的(显然)。

另请注意,NumPy中没有行向量或列向量的概念。它只是一个一维数组。如果您想专门强制数组成为列向量,则需要在第二维中引入一个单轴,以便执行此操作。请注意,只有np.where为您提供了匹配的结果,这才有效。之后,您可以使用np.vstacknp.hstack垂直和水平连接阵列来帮助您完成所要求的操作。你要做的第一件事就是创建一个空白的二维数组,然后做什么,我们只是覆盖:

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.因此,只有当v中至少有一个元素受制于v >= 30时,才会执行if语句。

+1

'np.flatnonzero'对于'1D'病例可能更有表现力。 – Divakar

+0

@Divakar aha,用'np.where'代替它。当然! – rayryeng

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) 
相关问题