根据代码中计算的值在Python数组中创建新列

时间:2015-07-17 17:27:13

标签: python arrays numpy add arcpy

目前我有一个格式如下的数组:arr = [(1,1),(1,1)...(35,1),(35,1)])

我编写了一个代码,为阵列中的每个有序对计算第三个值,一次一个。如何创建一个新列,将每个计算值存储为数组中的新列?

3 个答案:

答案 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]])

appendvstackhstackconcatenate的所有变体。您还可以构造一个(4,3)数组,并插入Arr和新计算的值。