【问题标题】:How to create structured arrays with list and array in Python?如何在 Python 中使用列表和数组创建结构化数组?
【发布时间】:2015-04-04 13:46:07
【问题描述】:

我有一个列表 A 的形式:

A = ['P', 'Q', 'R', 'S', 'T', 'U']

和一个数组 B 的形式:

B = [[ 1  2  3  4  5  6]
     [ 7  8  9 10 11 12]
     [13 14 15 16 17 18]
     [19 20 21 22 23 24]]

现在我想创建一个结构化数组 C 的形式:

C = [[ P  Q  R  S  T  U]
     [ 1  2  3  4  5  6]
     [ 7  8  9 10 11 12]
     [13 14 15 16 17 18]
     [19 20 21 22 23 24]]

这样我就可以提取列名为 P、Q、R 等的列。我尝试了以下代码,但它没有创建结构化数组并给出以下错误。

代码

import numpy as np
A = (['P', 'Q', 'R', 'S', 'T', 'U'])
B = np.array([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]])
C = np.vstack((A, B))
print (C)
D = C['P']

错误

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

在这种情况下如何在 Python 中创建结构化数组?

更新

两者都是变量,它们的形状在运行时会发生变化,但列表和数组的列数相同。

【问题讨论】:

  • B 中是否缺少某些列?
  • 我已经更新了数组 B。
  • 你所说的改变是什么意思?增加减少?至少numpy 'prefers' 有一个固定的形状,这就是为什么你应该首先获取所有数据然后启动 numpy 机器
  • 我的意思是列数可能会根据数据集增加或减少。
  • 您的C 看起来不像结构化数组(由genfromtxt 生成)。充其量它是一个包含字符串和数字的 dtype 对象数组,或者是一个字符串数组,引号被删除。

标签: python arrays numpy scipy


【解决方案1】:

如果你想在纯 numpy 中这样做,你可以这样做

A = np.array(['P', 'Q', 'R', 'S', 'T', 'U'])
B = np.array([[ 1,  2,  3,  4,  5,  6],
              [ 7,  8,  9, 10, 11, 12],
              [13, 14, 15, 16, 17, 18],
              [19, 20, 21, 22, 23, 24]])

# define the structured array with the names from A
C = np.zeros(B.shape[0],dtype={'names':A,'formats':['f8','f8','f8','f8','f8','f8']})

# copy the data from B into C
for i,n in enumerate(A):
    C[n] = B[:,i]

C['Q']
array([  2.,   8.,  14.,  20.])

编辑:您可以通过使用来自动化格式列表

C = np.zeros(B.shape[0],dtype={'names':A,'formats':['f8' for x in range(A.shape[0])]})

此外,名称不是作为数据出现在C 中,而是在dtype 中。为了从C 获取名称,您可以使用

C.dtype.names

【讨论】:

  • 我是否必须为每列添加格式,是否需要为大量列添加其他解决方法?
  • @nxcr :我认为您需要 formats 部分,但您可以将其自动化 -> 查看我的编辑
  • C 中缺少标题。如何将标题(即数组 A)保留在数组 C 中?
  • @nxcr :因为名称不是数据的一部分。要获取名称列表,请键入 C.dtype.names。当您只需键入 C 时,您也可以在 dtype 中看到它们。当您想要拥有类似 Excel 的“视图”时,您必须改用 pandas
  • 但是当我使用 np.genfromtxt() 生成数组时,我得到了这样的标题。
【解决方案2】:

这就是 pandas 库的用途:

>>> A = ['P', 'Q', 'R', 'S', 'T', 'U']
>>> B = np.arange(1, 25).reshape(4, 6)
>>> B
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18],
       [19, 20, 21, 22, 23, 24]])
>>> import pandas as pd
>>> pd.DataFrame(B, columns=A)
    P   Q   R   S   T   U
0   1   2   3   4   5   6
1   7   8   9  10  11  12
2  13  14  15  16  17  18
3  19  20  21  22  23  24
>>> df = pd.DataFrame(B, columns=A)
>>> df['P']
0     1
1     7
2    13
3    19
Name: P, dtype: int64
>>> df['T']
0     5
1    11
2    17
3    23
Name: T, dtype: int64
>>>

【讨论】:

    【解决方案3】:

    您的错误发生在:

    D = C['P']
    

    这是一个简单的方法,在标题行使用常规 Python 列表。

    import numpy as np
    A = (['P', 'Q', 'R', 'S', 'T', 'U'])
    B = np.array([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], 
        [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]])
    C = np.vstack((A, B))
    print (C)
    D = C[0:len(C), list(C[0]).index('P')]
    print (D)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多