【问题标题】:Simple Iteration Array Error Python简单的迭代数组错误 Python
【发布时间】:2017-03-24 01:23:51
【问题描述】:

这段代码试图获取两个简单的数组并将它们应用于一个函数并将结果输出到一个新数组中。我从 Stack 尝试了几种不同的修复方法,但似乎没有任何帮助。代码给出“索引 15 超出轴 0 大小 4 的范围”错误。还值得注意的是,这是我的第一个 Python 代码,所以我有点挣扎。我更习惯于 Java。我假设它是一个简单的错误,但是我还没有在 Stack 上找到解决方案。

import math
import numpy as np

aVec = np.array ([3.14, 15, 9, 26]);
bVec = np.array ([[2.71], [8], [28], [182]]);

lengthaVec = len(aVec);
yVec = [lengthaVec]
i = 0;
for i in aVec:
   yVec.append (math.sqrt(math.pow(np.transpose((aVec[i])), 2) +             math.pow(bVec[i], 2)));

print yVec

【问题讨论】:

  • Python 不需要分号来终止语句。如果您希望将多个语句放在同一行上,可以使用分号分隔语句。

标签: python arrays numpy indexing iteration


【解决方案1】:

问题在于您的迭代器for i in aVec -> 这将无法访问数组中的所有值。

检查以下代码:

import math
import numpy as np

aVec = np.array ([3.14, 15, 9, 26])
bVec = np.array ([[2.71], [8], [28], [182]])

lengthaVec = len(aVec)
yVec = [lengthaVec]
i = 0
for i in range(len(aVec)):
   yVec.append (math.sqrt(math.pow(np.transpose((aVec[i])), 2) + math.pow(bVec[i], 2)))

【讨论】:

  • 好像是这样。但是,我还有其他几个 for 循环在循环中没有该位的情况下工作。但就这个例子而言,它是有效的。
  • 如果您将执行 len(aVec),它将返回值 4。这只是循环遍历的一种方式。您也可以使用其他方法。
【解决方案2】:

看看我在aVec 上迭代时得到了什么——来自该数组的值,而不是索引。

In [607]: for i in aVec:
     ...:     print(i)
     ...:     
3.14
15.0
9.0
26.0

错误中的 15 来自此迭代,并尝试使用该值作为索引,aVec[15]

"index 15 is out of bounds for axis 0 with size 4"

将迭代器更改为range...,因此连续值为0,1,2,3

for i in range(aVec.shape[0]):
    print(math.sqrt(math.pow(np.transpose((aVec[i])), 2) +math.pow(bVec[i], 2)));

4.147734321289154
17.0
29.410882339705484
183.84776310850236

还有其他的迭代方式,可能也可以在没有迭代的情况下进行计算(参见以下编辑)

zip 非常适合协调迭代:

for a,b in zip(aVec, bVec):
     print(math.sqrt(math.pow(np.transpose((a)), 2) +math.pow(b, 2)));
     .

但是如果a 是1 值,转置是没有意义的。所以我们可以放弃它。

我们可以通过以下方式删除迭代(或将其移动到已编译的代码中):

In [619]: np.sqrt(aVec**2+bVec.T**2)
Out[619]: array([[   4.14773432,   17.        ,   29.41088234,  183.84776311]])

我不得不使用bVec.T(转置),因为您将其定义为 (4,1) 数组,而 aVec 的形状为 (4,)。简单的做

aVec**2 + bVec**2

产生一组 (4,4) 值 - “外部”总和。在某些情况下很好,但可能不是您想要的。

另一种方法 - 将两者加入二维数组,对所有元素求平方,求和和 sqrt:

np.sqrt((np.array((aVec, bVec.ravel()))**2).sum(0))
np.linalg.norm(np.array((aVec, bVec.ravel())),axis=0)

ravel() 是使bVec 1d 像aVec 一样的另一种方式。

【讨论】:

    【解决方案3】:

    在 python 中,迭代器经常使用range 特性。您认为您的代码可以简单地更正是正确的。查看您的 for 循环:

    i = 0
    for i in aVec:
    

    变成,简单地说:

    for index in range(1,len(aVec):
        yVec.append (math.sqrt(math.pow(np.transpose((aVec[index])), 2)+ math.pow(bVec[index], 2)));
    

    这里我们已经正确地将循环分配给数组的长度。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 2023-04-01
      • 2011-08-11
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多