我需要这样的事情:
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个元素代表一个隐藏行,该隐藏行只需要一个1
和0
。换句话说,每个条目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])
我需要一种方法来做到这一点,但我太新了,不知道怎么做。
答案 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])
这不是你提到的;我是否误解了您的要求,或者是基于不同数据的示例?