尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”

Posted

技术标签:

【中文标题】尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”【英文标题】:"IndexError: too many indices for array" when trying to count unique items in numpy array column 【发布时间】:2021-02-05 17:30:06 【问题描述】:

我有一个名为 data 的 numpy 数组,它有 8 列,并在行中进行递归操作,因此每次通过我需要应用的函数时,它的行数都是可变的。

在该函数中,我有以下代码行,它应该计算出现在数组最后一列中的每个唯一值的出现次数,无论我的数组当时有多少行:

labels, counts = np.unique(data[:,-1], return_counts=True)

这行代码返回一个IndexError: too many indices for array,我认为这与我对列的切片方式有关,但我不知道如何修复它。我一直在谷歌搜索和编辑,但我尝试过的似乎都没有解决它。帮助将不胜感激。谢谢。

【问题讨论】:

在运行时打印data.shape 并检查data 的形状可能很有用。 【参考方案1】:

你有没有混合数据类型的结构化数组?我可以使用带有一个的索引方法生成该错误的唯一方法。例如

a = np.arange(0, 8*5).reshape(5, 8)
a
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29, 30, 31],
       [32, 33, 34, 35, 36, 37, 38, 39]])

a[:,-1]  # as a check... array([ 7, 15, 23, 31, 39])

np.unique(a[:, -1], return_counts=True)  # works as designed
(array([ 7, 15, 23, 31, 39]), array([1, 1, 1, 1, 1], dtype=int64))

# ---- a quick way to convert from uniform dtype to structured array
from numpy.lib.recfunctions import unstructured_to_structured as uts

b = uts(a)
b
array([( 0,  1,  2,  3,  4,  5,  6,  7), ( 8,  9, 10, 11, 12, 13, 14, 15),
       (16, 17, 18, 19, 20, 21, 22, 23), (24, 25, 26, 27, 28, 29, 30, 31),
       (32, 33, 34, 35, 36, 37, 38, 39)],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'),
             ('f4', '<i4'), ('f5', '<i4'), ('f6', '<i4'), ('f7', '<i4')])

# ---- you can slice a structured array, you have to access it through it field
np.unique(b[:, -1], return_counts=True)

Traceback (most recent call last):
  File "<ipython-input-8-51ab6cec2618>", line 1, in <module>
    np.unique(b[:, -1], return_counts=True)
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

# ---- to fix it, access the last field by its name
np.unique(b['f7'], return_counts=True)
(array([ 7, 15, 23, 31, 39]), array([1, 1, 1, 1, 1], dtype=int64))

【讨论】:

以上是关于尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”的主要内容,如果未能解决你的问题,请参考以下文章

创建非常大的numpy数组时出现MemoryError [重复]

Python - 尝试使用 PIL 的 Image.fromarray 保存 numpy 数组时出现 TypeError

生成 numpy.MultivariateNormal 时出现 MemoryError

Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误

Numpy - 如何根据其他列中的二进制值计算列中的值?

如何将 numpy 数组存储在 Pandas 数据框的列中?