目前我有一个格式如下的数组:arr = [(1,1),(1,1)...(35,1),(35,1)])
我编写了一个代码,为阵列中的每个有序对计算第三个值,一次一个。如何创建一个新列,将每个计算值存储为数组中的新列?
答案 0 :(得分:1)
元组是不可变的,所以你不能直接改变它们。幸运的是,您可以将另一个元组连接到它们。假设你有一个数组:
arr = [(1, 2), (3, 4), (5, 6)]
并且你想为每个元组附加一些整数,假设为了简单起见,arr
中的元组索引。也就是说,您希望最终列表为:
arr = [(1, 2, 0), (3, 4, 1), (5, 6, 2)]
以下代码将执行此操作:
arr = [item + (a.index(item),) for item in arr]
请注意(a.index(item),)
中的逗号和括号对于形成元组而不是整数至关重要。 (您只能将元组连接到其他元组。)因此,如果您只想为特定元组添加数字,请尝试:
arr[0] += (3,)
会将3
附加到arr
中第一个元素的末尾。这将允许您在生成第三个点的任何循环中执行此类连接,您可以说这是一次发生一个。快乐的编码!
答案 1 :(得分:0)
备用解决方案,只需在你去的时候替换元组。
for i in range(len(arr)):
arr[i] = (arr[i][0], arr[i][1], arr[i][0] * arr[i][1])
答案 2 :(得分:0)
Array formated as arr = [(1,1),(1,1)...(35,1),(35,1)]
可能令人困惑。它看起来像list
tuples
。如果那就是它,那么你需要使用列表推导来创建一个新列表:
arr1 = [(i,j, fun(i,j)) for i,j in arr]
e.g。
In [359]: arr=[(1,1),(1,2),(35,1),(35,2)]
In [360]: [(i[0],i[1], sum(i)) for i in arr]
Out[360]: [(1, 1, 2), (1, 2, 3), (35, 1, 36), (35, 2, 37)]
但是你在评论中说arr
是一个numpy数组。
In [361]: Arr=np.array(arr)
In [362]: Arr
Out[362]:
array([[ 1, 1],
[ 1, 2],
[35, 1],
[35, 2]])
相同的数字,但它显示为列表列表。显示为元组列表的数组是结构化数组,具有不同的dtype
。
该函数是否可以采用整个数组,或者必须将值2提供2?
np.sum
获取整个数组,并返回2d结果:
In [366]: np.sum(Arr, axis=1, keepdims=True)
Out[366]:
array([[ 2],
[ 3],
[36],
[37]])
可以很容易地连接到Arr
给出一个新数组:
In [370]: np.concatenate([Arr,np.sum(Arr, axis=1, keepdims=True)],axis=1)
Out[370]:
array([[ 1, 1, 2],
[ 1, 2, 3],
[35, 1, 36],
[35, 2, 37]])
另一方面,Python
sum
只需要数字。 Arr
可以像列表一样用于理解:
In [371]: [sum(i) for i in Arr]
Out[371]: [2, 3, 36, 37]
要将它连接到原始数据上,我需要将其转换为2d'垂直'数组(如Out [366]所示)
In [376]: np.concatenate([Arr,np.array([sum(i) for i in Arr])[:,None]],axis=1)
Out[376]:
array([[ 1, 1, 2],
[ 1, 2, 3],
[35, 1, 36],
[35, 2, 37]])
append
,vstack
,hstack
是concatenate
的所有变体。您还可以构造一个(4,3)
数组,并插入Arr
和新计算的值。