我应该如何修复 IndexError:标量变量的索引无效?

问题描述 投票:0回答:1

我正在迭代 N 的范围:

for i in range(N):
 angle1 = np.deg2rad(np.random.uniform(0, 10))
 angle2 = np.deg2rad(np.random.uniform(0, 180))
 interchange_indices = np.random.rand(i) < 0.5
 angle1[interchange_indices], angle2[interchange_indices] = angle2[interchange_indices], angle1[interchange_indices]

 kappa = evolve(angle1, angle2, L)

问题发生在

interchange_indices
,我得到了
IndexError: invalid index to scalar variable.

我最初将角度1(角度2类似)定义为

angle1 = np.deg2rad(np.random.uniform(0, 10, i))
,但由于使用i进行随机采样而出现问题。因此,我改用了
low, high
方法。然而,它创造了这个新问题。我应该怎么办?预先感谢。

python numpy
1个回答
0
投票

没有明确说明,但我假设您正在尝试执行以下操作:

  • 生成几对角度
  • 每对:
    • 第一个角度是从 0 到 10 度之间均匀分布中随机采样的
    • 第二个是从 0 到 180 度之间的均匀分布中随机采样的
  • 对于每一对,以 50% 的概率交换角度的顺序

发生索引错误是因为如所写,

angle1
angle2
是标量,而不是数组。标量根本不支持索引。

import numpy as np
angle1 = np.deg2rad(np.random.uniform(0, 10))
angle1[True]  # IndexError: invalid index to scalar variable.

如果

angle
是 0d 数组,则可以通过标量或 0d 数组对它们进行索引:

angle1 = np.asarray(np.deg2rad(np.random.uniform(0, 10)))
angle1[False]  # array([], dtype=float64)
angle1[np.asarray(True)]  # array([0.03021378])

但是你的问题是

interchange_indices
永远不是标量或 0d 数组;它是一个长度为
i
的数组。

for i in range(3):
     interchange_indices = np.random.rand(i) < 0.5
     print(interchange_indices)
# []
# [False]
# [ True  True]

您有两种选择来解决该错误。如果你想保持循环,你只需要

interchange_indices
是一个标量,并且你可能只想使用
if
语句而不是布尔索引。

N = 3
for i in range(N):
    angle1 = np.deg2rad(np.random.uniform(0, 10))
    angle2 = np.deg2rad(np.random.uniform(0, 180))
    # interchange_indices = np.random.rand(i) < 0.5
    # there should not be an `i` in the line above
    # that would produce an array of length i, but angle1 and angle2 are scalars
    interchange_indices = np.random.rand() < 0.5
    if interchange_indices:
        angle1, angle2 = angle2, angle1
    print(angle1, angle2, interchange_indices)
# 0.14806055963275674 1.033872399798009 False
# 1.0644875532575504 0.08971188854189044 True
# 0.1720723141790743 0.32268645386711226 False

或者,我不明白你原来的方法有什么问题:

angle1 = np.deg2rad(np.random.uniform(0, 10, N))
angle2 = np.deg2rad(np.random.uniform(0, 180, N))
interchange_indices = np.random.rand(N) < 0.5
angle1[interchange_indices], angle2[interchange_indices] = (
    angle2[interchange_indices], angle1[interchange_indices])
angle1, angle2, interchange_indices

没有说明

evolve
应该做什么。如果它只接受标量,您不妨使用第一种方法。如果它接受数组,请使用第二种方法。

© www.soinside.com 2019 - 2024. All rights reserved.