【问题标题】:Indexing values using a for loop and numpy for Python 3在 Python 3 中使用 for 循环和 numpy 索引值
【发布时间】:2019-10-01 17:27:26
【问题描述】:

我希望使用 numpy 从 Matlab 过渡到 Python。我在理解使用 numpy 的数组索引时遇到了一些困难。

例如,我希望使用“for”循环将行向量的内部元素分配为特定值。在索引 1 级列数组与行数组时,numpy 中的索引似乎是独一无二的。


# Python:
import nump as np
from numpy import*
import scipy.linalg

N = 5
L = 1.0
dx = L / N
S = 10.0 ** -2.0
k = 500.0

aW = zeros((1, N))

for i in range(1, (N-1)):
    aE[0, i] = k * S / dx


% Matlab:
N=5;
L=1.0;
dx=L/N;
S=10^(-2.0);
k=500.0;

aW=zeros(1,N);

for i = 2:N-1
    aE(i)=k*S/dx;
end

我是否需要指定行索引为0,而不是只说:

'aE[i] = k * S / dx'

在基于索引的单个输入分配元素时,Matlab 似乎并不关心矩阵的维度。

我对说明行索引没有意见。它让我更加意识到我的可变维度。我只是想验证它是必要的。也许我错误地设置了向量。非常感谢您的帮助。

【问题讨论】:

  • numpy aE[0] 中确实是aE[0, :]。它索引数组的第一个维度。您可以将数组定义为aE = np.zeros((N,),在这种情况下它将是 1d。一个关键的区别是,在 MATLAB 中,一切都是 2d(或更大)的。
  • 为什么要迭代地设置数组的所有值(具有相同的标量值)?在我以前的 MATLAB 时代,那效率会很低。
  • numpy 中,前导维度是外部维度;在 MATLAB 中,它是尾随的。所以你也可以定义aE=np.zeros((N,1)) 来创建一个“列向量”,并使用aE[i] 进行迭代。有时这是必要的,但通常一维数组就可以了。
  • 代码来自本科作业。考虑到您可以将元素 2:N-1 分配为常量标量值,也许在我的问题中包含它是一个糟糕的例子。话虽如此,我更关心的是索引的方式。据我所知,似乎迭代行向量需要声明行(即在这种情况下为 0)。这很好,只是我必须考虑的细微差别。正如你所提到的,我可能会坚持使用列向量。我不确定这在我的代码中出现的频率。就我而言,这可能取决于我导入的数据。

标签: python-3.x numpy


【解决方案1】:

您应该尽量避免使用 for 循环进行迭代,而是尝试使用广播来解决问题。

了解 numpy 广播

https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

例如,您可以这样做。

>>> import numpy as np
>>> np.full((2,3), 10)
array([[10, 10, 10],
       [10, 10, 10]])

>>> a = np.ones((2,3))
>>> a
array([[1., 1., 1.],
       [1., 1., 1.]])
>>> a * 10
array([[10., 10., 10.],
       [10., 10., 10.]])


>>> b = np.zeros((2,3))
>>> b
array([[0., 0., 0.],
       [0., 0., 0.]])
>>> b+10
array([[10., 10., 10.],
       [10., 10., 10.]])

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2021-05-10
    • 1970-01-01
    • 2014-01-04
    • 2018-12-06
    相关资源
    最近更新 更多