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

2024-10-02 18:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个需要翻译成python的MATLAB代码,但是在firings数组中创建一个新列时有一个问题。在MATLAB中,代码创建了一个n*2矩阵,它最初是空的,我希望在python中也能这样做。使用NumPy,我创建了fired = np.where(v >= 30)。但是python创建的是元组而不是数组,因此会抛出一个错误:

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

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

^{pr2}$

感谢帮助!谢谢!在


Tags: 代码numpytype错误np矩阵数组where
2条回答

如果数组本质上是1D,^{}将生成一个两元素元组。对于1D情况,您只需要访问np.where结果的第一个元素:

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

然后可以继续连接矩阵。另外,user @Divakar提供的一个建议是使用^{},它将等价地在NumPy数组中找到非零值,并将其展平到1D数组中,以减少麻烦:

^{pr2}$

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

还要注意,NumPy中没有行向量或列向量的概念。它只是一个一维数组。如果您想明确地将数组强制为列向量,那么您需要在第二维中引入一个单轴轴来实现这一点。请注意,只有在np.where给出匹配结果的情况下,这才有效。之后,您可以使用^{}^{}来垂直和水平连接数组,以帮助您完成所要求的操作。您首先要做的是创建一个空的二维数组,然后执行我们刚刚介绍的内容:

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的结果没有生成结果,fired中的元素数应该是0。因此,if语句只有在v中发现至少一个元素属于{}时才会执行。在

如果使用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)

相关问题 更多 >