NumPy - 迭代2D列表和打印(行,列)索引

时间:2016-12-11 17:54:19

标签: python pandas numpy

我在使用NumPy和/或Pandas处理2D列表时遇到困难:

  1. 获取所有元素的唯一组合的sum,而无需再次从同一行中选择(下面的数组应该是81种组合)。

  2. 打印组合中每个元素的行和列。

  3. 例如:

    arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]]
    
    (1,3,12,20), Sum = 36 and (row, col) =  [(0,0),(1,1),(2,1),(3,2)]
    
    (4,10,16,20), Sum = 50 and (row, col) =[(0,2),(1,0),(2,0),(3,2)]
    

2 个答案:

答案 0 :(得分:5)

通过创建所有此类组合和求和来实现:以下是使用itertools.product <?php $conn = new PDO('mysql:host=localhost;dbname=android',$uname,$pwd); // Check connection $id=$_POST["id"]; $name=$_POST["name"]; $statement = $conn->prepare("INSERT INTO sample(id, name) VALUES(:id, :name)"); $statement->execute(array( "id" => $id, "name" => $name )); ?> 的矢量化方法 -

array-indexing

示例运行 -

from itertools import product

a = np.asarray(arr)  # Convert to array for ease of use and indexing
m,n = a.shape
combs = np.array(list(product(range(n), repeat=m)))
out = a[np.arange(m)[:,None],combs.T].sum(0)

符合记忆效率的方法:这是一种不创建所有这些组合的方法,而是使用即时broadcasted总结,而哲学的灵感来自于this other post -

In [296]: arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]]

In [297]: a = np.asarray(arr)
     ...: m,n = a.shape
     ...: combs = np.array(list(product(range(n), repeat=m)))
     ...: out = a[np.arange(m)[:,None],combs.T].sum(0)
     ...: 

In [298]: out
Out[298]: 
array([41, 31, 47, 37, 27, 43, 38, 28, 44, 34, 24, 40, 30, 20, 36, 31, 21,
       37, 39, 29, 45, 35, 25, 41, 36, 26, 42, 42, 32, 48, 38, 28, 44, 39,
       29, 45, 35, 25, 41, 31, 21, 37, 32, 22, 38, 40, 30, 46, 36, 26, 42,
       37, 27, 43, 44, 34, 50, 40, 30, 46, 41, 31, 47, 37, 27, 43, 33, 23,
       39, 34, 24, 40, 42, 32, 48, 38, 28, 44, 39, 29, 45])

答案 1 :(得分:1)

您可以使用product中的itertools功能:

from itertools import product    
y = [sum(p) for p in product(*arr)]

len(y)
# 81

列表较小的示例:

arr = [[1,2],[3,4],[5,6]]
[sum(p) for p in product(*arr)]
# [9, 10, 10, 11, 10, 11, 11, 12]