gpt4 book ai didi

python - 从命名元组列表中写入 numpy.array()

转载 作者:行者123 更新时间:2023-12-01 08:38:58 24 4
gpt4 key购买 nike

我有一个命名元组列表,我想将其写入 numpy 数组。这些元组具有属性“colors”(两种颜色的集合)和“number”(一个整数),其形式如下:

from collections import namedtuple
import numpy as np

NamedTuple = namedtuple('tuple',['colors','number'])

L = [NamedTuple({'violet', 'blue'}, 4),
NamedTuple({'orange', 'blue'}, 1),
NamedTuple({'green', 'blue'}, 3),
NamedTuple({'orange', 'red'}, 2)]
L
>>>[tuple(colors={'blue', 'violet'}, number=4)...]
L[3].colors
>>>{'orange', 'red'}

我想从 L 写入一个 2x2 数组,例如:

Array[1][1].colors
>>>{'orange', 'red'}

正在做

Array = numpy.array(L)
>>>[[{'blue', 'violet'} 4]
[{'blue', 'orange'} 1]
[{'blue', 'green'} 3]
[{'red', 'orange'} 2]

给我一​​个元组数组,而不是命名元组,它“没有属性‘颜色’”
更糟糕的是,如果我尝试将数组 reshape 为 2x2,我会发现命名元组的每个属性都已被写入数组中的不同对象。

numpy.reshape(Array,(2,2))
>>>...error...
>>>'ValueError: cannot reshape array of size 8 into shape (2,2)'

我本以为上面的数组大小是 4?

如何在不改变命名元组的情况下获取命名元组数组,以便我可以从数组中的每个元素调用不同的属性?

我想使用命名元组作为我的数据结构的原因是这样可以轻松且可读地调用每个对象的 .color 或 .number 属性。
我想使用 numpy 数组而不是标准嵌套列表的原因是因为这个数组将成为整个项目中的动态对象,经常会被搜索和更改,而且我知道 python 的标准列表对于这些来说是多么糟糕东西。
对于上下文,我最终试图构建一个程序来玩我自己发明的纸牌游戏。命名元组代表卡片及其颜色和数字。阵列代表了玩家可以改变和移动的卡牌画面。这些命名元组将被多次洗牌,我不想担心它们的数据结构发生变化。

最佳答案

因为NamedTupletuple的子类,从L构造一个对象数组会得到一个(n,2)数组,与如果我们将其作为元组列表或列表列表给出:

In [4]: np.array(L, object)
Out[4]:
array([[{'violet', 'blue'}, 4],
[{'blue', 'orange'}, 1],
[{'blue', 'green'}, 3],
[{'red', 'orange'}, 2]], dtype=object)
In [5]: _.shape
Out[5]: (4, 2)

这里有一个技巧 - 首先将 None 对象附加到列表中:

In [13]: arr = np.array(L+[None], object)[:-1]
In [14]: arr
Out[14]:
array([tuple(colors={'violet', 'blue'}, number=4),
tuple(colors={'blue', 'orange'}, number=1),
tuple(colors={'blue', 'green'}, number=3),
tuple(colors={'red', 'orange'}, number=2)], dtype=object)
In [15]: arr.shape
Out[15]: (4,)
In [16]: arr = np.reshape(arr,(2,2))
In [17]: arr
Out[17]:
array([[tuple(colors={'violet', 'blue'}, number=4),
tuple(colors={'blue', 'orange'}, number=1)],
[tuple(colors={'blue', 'green'}, number=3),
tuple(colors={'red', 'orange'}, number=2)]], dtype=object)

我在之前的问题中发现 frompyfunc 是访问此类数组元素最方便(也是最快)的工具。

Most efficient way to set attributes on objects in array

In [18]: np.frompyfunc(lambda x: x.colors, 1,1)(arr)
Out[18]:
array([[{'violet', 'blue'}, {'blue', 'orange'}],
[{'blue', 'green'}, {'red', 'orange'}]], dtype=object)
<小时/>

要构造结构化数组,我们可以这样做:

In [19]: arr1 = np.array(L, dtype=[('colors', object), ('number', int)])
In [20]: arr1
Out[20]:
array([({'violet', 'blue'}, 4), ({'blue', 'orange'}, 1),
({'blue', 'green'}, 3), ({'red', 'orange'}, 2)],
dtype=[('colors', 'O'), ('number', '<i8')])

NamedTupletuple 的子类,因此它用作数据输入(例如元组列表)。

In [22]: arr1['colors']
Out[22]:
array([{'violet', 'blue'}, {'blue', 'orange'}, {'blue', 'green'},
{'red', 'orange'}], dtype=object)
In [23]: arr1['number']
Out[23]: array([4, 1, 3, 2])
<小时/>

初始化一维数组并分配元素是有效的:

In [30]: arr2 = np.empty(4, object)
In [31]: arr2[:] = L
In [32]: arr2
Out[32]:
array([tuple(colors={'violet', 'blue'}, number=4),
tuple(colors={'blue', 'orange'}, number=1),
tuple(colors={'blue', 'green'}, number=3),
tuple(colors={'red', 'orange'}, number=2)], dtype=object)

填充np.empty((2,2), object)会有点棘手。

<小时/>

我可以使用结构化数组(或任何其他一对输入列表)的字段构造一个对象数组:

In [44]: np.frompyfunc(NamedTuple, 2,1)(arr1['colors'], arr1['number'])
Out[44]:
array([tuple(colors={'violet', 'blue'}, number=4),
tuple(colors={'blue', 'orange'}, number=1),
tuple(colors={'blue', 'green'}, number=3),
tuple(colors={'red', 'orange'}, number=2)], dtype=object)

关于python - 从命名元组列表中写入 numpy.array(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53576138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com