numpy:每行检查1个元素

时间:2018-02-20 05:55:09

标签: python numpy

我需要这样的事情:

arr = array([[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
        0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
        0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
        0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
        0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
        0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]])

每行包含36个元素,一行中每6个元素代表一个隐藏行,该隐藏行只需要一个10。换句话说,每个条目mod 6只需要一个1。这是我对arr的要求。

我有一张表,用于计算每一行的“适应度”值。也就是说,我有一个

table = np.array([10, 5, 4, 6, 5, 1, 6, 4, 9, 7, 3, 2, 1, 8, 3,
                          6, 4, 6, 5, 3, 7, 2, 1, 4, 3, 2, 5, 6, 8, 7, 7, 6, 4, 1, 3, 2])
table = table.T

我要将arr的每一行乘以table。该乘法的结果1x1矩阵将被存储为该对应行的“适应度”值。 UNLESS 该行不符合上述要求,该要求应返回0.

应该返回的一个例子是

result = array([5,12,13,14,20,34])

我需要一种方法来做到这一点,但我太新了,不知道怎么做。

2 个答案:

答案 0 :(得分:2)

(我想假设你想要你在上半场要求的东西)。

我相信存在更好或更优雅的解决方案,但我认为这可以做到这一点。

np.all(arr[:,6] == 1) and np.all(arr[:, :6] == 0) and np.all(arr[:, 7:])

或者,您可以构建数组(使用0' s和1' s),然后只需使用not_equal进行比较。

答案 1 :(得分:0)

我也不是100%肯定你的问题,但我会尽我所知来回答。

既然你说你的矩阵有"隐藏的行",要检查它是否格式正确,最简单的方法似乎只是重塑它:

# First check, returns true if all elements are either 0 or 1
np.in1d(arr, [0,1]).all()
# Second check, provided the above was True, returns True if
# each "hidden row" has exactly one 1 and other 0.
(arr.reshape(6,6,6).sum(axis=2) == 1).all()

两张支票都返回" True"为您的arr

现在,我的理解是每个"大"一排36个元素,你想要一个带有"表格的标量产品"矢量,除非那个"大"排有一个不正常的"隐藏的小"行。在这种情况下,我会做类似的事情:

# The following computes the result, not checking for integrity
results = arr.dot(table)
# Now remove the results that are not well formed.
# First, compute "large" rows where at least one "small" subrow
# fails the condition.
mask = (arr.reshape(6,6,6).sum(axis=2) != 1).any(axis=1)
# And set the corresponding answer to 0
results[mask] = 0

但是,针对您的数据运行此代码将返回

  

数组([38,31,24,24,32,20])

这不是你提到的;我是否误解了您的要求,或者是基于不同数据的示例?