【问题标题】:Finding numpy array expression equivalent to MATLAB查找等效于 MATLAB 的 numpy 数组表达式
【发布时间】:2018-09-05 16:44:06
【问题描述】:

我找到了等效的 numpy 表达式,它等效于 MATLAB 表达式,如下所示:

[1: (arr(foo) - 1), (arr(foo) + 1): K];

其中 foo 和 K 是整数,arr 是 ndarray。 我认为等效代码是这样的:

np.append(np.arange(0, arr[foo] - 1), np.arange((arr[foo]), K))

但是,如果 K 为 2,arr.size 为 2,则这两个表达式不相同。 我认为这是因为 MATLAB 表达式 [1:1] 返回 1,但 np.arange(1,1) 返回空数组。

如何高效地将上述 MATLAB 代码表达为 Python3 代码?

【问题讨论】:

  • 使用concatenate 而不是append。并确保个人aranges 有效。
  • @hpaulj 作为 python 学习者,问:为什么它的连接比附加更好?
  • 查看 np.append 的代码。
  • @hpaulj 是的,它是一个方便的连接...为什么我不使用那个?

标签: python-3.x matlab numpy


【解决方案1】:

在 Octave 会话中:

>> [1: (5-1), (5+1) : 10]
ans =
    1    2    3    4    6    7    8    9   10

在带有 numpy 的 Ipython 中:

In [70]: np.r_[1:5, (5+1):(10+1)]
Out[70]: array([ 1,  2,  3,  4,  6,  7,  8,  9, 10])

np.r_ 是一个具有索引方法的类,它使用np.arangenp.concatenate,如:

In [71]: np.concatenate([np.arange(1,5), np.arange(5+1, 10+1)])
Out[71]: array([ 1,  2,  3,  4,  6,  7,  8,  9, 10])

np.concatenate 有各种覆盖函数来操纵输入,例如通过添加维度或散开等。

行为最像 MATLAB 的[x y; z w]np.block,它可以递归地连接列表。不过,这里没有什么不同:

In [72]: np.block([np.arange(1,5), np.arange(5+1, 10+1)])
Out[72]: array([ 1,  2,  3,  4,  6,  7,  8,  9, 10])

为了完整起见,一个 Python 列表版本:

In [73]: list(range(1,5))+list(range(6,11))
Out[73]: [1, 2, 3, 4, 6, 7, 8, 9, 10]

我不喜欢append,因为它经常被滥用。它不是列表附加的克隆。如果没有axis,它会破坏第一个论点。一次将标量添加到一维数组就可以了,就是这样。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2019-09-27
    • 2013-05-01
    • 2018-10-25
    相关资源
    最近更新 更多