代码之家  ›  专栏  ›  技术社区  ›  Anewil

切片时数组索引过多

  •  -1
  • Anewil  · 技术社区  · 8 年前

    尝试切片时,出现错误“IndexError:数组索引太多”。

    我可以打印数组的每个字段,如下所示:

    vector = np.random.choice(data)
    print(vector)
    vec1 = vector[-1]
    print(vec1)
    vec2 = vector[1]
    print(vec2)
    

    (5.5、2.5、4、1.3,“鸢尾花色”)

    鸢尾花色

    2.5

    当我添加该行时:

    vec3 = vector[:-1]
    

    我收到错误:

    索引器错误:数组的索引太多

    这里可能有什么问题?

    //编辑

    我从iris文件中获取数据

    names = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']
    data = np.genfromtxt('iris.data', delimiter=',', dtype=None, encoding=None, names=names)
    

    我还检查了vecotr的类型

    print(type(vector))
    

    “numpy”类。作废'

    2 回复  |  直到 8 年前
        1
  •  3
  •   hpaulj    8 年前

    这与@user2357112的解释基本相同:

    In [82]: data = np.array([(5.5, 2.5, 4., 1.3, 'Iris-versicolor')],dtype='f,f,f,f,U20')
    In [83]: vector = np.random.choice(data)
    In [84]: vector
    Out[84]: (5.5, 2.5, 4., 1.3, 'Iris-versicolor')
    In [85]: vector[-1]
    Out[85]: 'Iris-versicolor'
    In [86]: vector[1]
    Out[86]: 2.5
    In [87]: vector[:-1]
    IndexError: too many indices for array
    In [88]: vector.dtype
    Out[88]: dtype([('f0', '<f4'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<U20')])
    In [89]: vector['f2']
    Out[89]: 4.0
    

    data 可能有更多元素,但 choice 如果没有其他参数,则只返回一个,作为0d数组( vector.shape )。

    通常,我们用字段名为结构化数组的字段编制索引,但也可以按数字访问它们。但不可能通过切片访问它们。

    可以使用 item ,产生 tuple :

    In [90]: vector.item()
    Out[90]: (5.5, 2.5, 4.0, 1.2999999523162842, 'Iris-versicolor')
    In [91]: _[:-1]
    Out[91]: (5.5, 2.5, 4.0, 1.2999999523162842)
    

    还可以使用列表访问多个字段:

    In [92]: vector.dtype.names
    Out[92]: ('f0', 'f1', 'f2', 'f3', 'f4')
    In [93]: vector.dtype.names[:-1]
    Out[93]: ('f0', 'f1', 'f2', 'f3')
    In [95]: vector[list(vector.dtype.names[:-1])]
    Out[95]: (5.5, 2.5, 4., 1.3)
    

    但这个多字段名称代码正在开发中,因此各个版本的详细信息可能会有所不同。

        2
  •  2
  •   user2357112    8 年前

    您似乎有一条从NumPy结构化数组或类似的内容中提取的记录。此记录看起来像一个元组,但实际上是 numpy.void ,则, numpy.record ,或某些相关类型。要将其转换为元组,可以使用

    tup = vector.tolist()
    

    (是的, tolist() 然后可以对结果执行普通的元组操作,包括切片。