【发布时间】:2021-11-22 19:40:46
【问题描述】:
问题:我正在尝试基于“打包”或更短的主向量 V 生成 n 元素的 m 向量em>,比 m x n 短,以及一个长度为 n 的布尔向量,用于确定元素如何重复。 (向量在下面有更多解释)。主向量的创建方式以及使用的结果仅在必须遵守格式(主向量和布尔值,结果为 m x n)方面相关。
例如,如果元素 0 的布尔值为 False,则所有 m 向量对于元素 0 将具有相同的值,V[0]。如果元素 1 的布尔值为 True,则向量 0 将具有来自 V[1] 的元素 1,但向量 1 将具有来自 V[6] 的元素 1。一个主向量,V,属于;
(1,2,3,4,5,6,10,30,40,60,100,300,400,600)
和一个布尔向量
1, 0, 1, 1, 0, 1
应该产生三个结果向量;
[1 2 3 4 5 6]
[10. 2. 30. 40. 5. 60.]
[100. 2. 300. 400. 5. 600.]
它们共享一些元素,但不共享其他元素。我有一个方法,但它依赖于嵌套循环和 if 语句。 我尝试过的:一个有效但效率低下的示例,其中包含 6 个元素的 3 个结果向量:
import numpy as np
p = np.array((1,2,3,4,5,6,10,30,40,60,100,300,400,600))
genome = np.array((1, 0, 1, 1, 0, 1))
index = 0
for i in range(0,3):
if i==0:
pBase = p[0:genome.size]
print(pBase)
else:
extra = np.zeros(genome.size)
for j in range(0,genome.size):
if genome[j]==True:
extra[j] = p[genome.size+index]
index += 1
pSplit = np.where(genome==False, pBase, extra)
print(pSplit)
返回(如预期):
[1 2 3 4 5 6]
[10. 2. 30. 40. 5. 60.]
[100. 2. 300. 400. 5. 600.]
每个循环耗时 45.1 µs ± 2.4 µs。对于假设的简单操作来说,这似乎不必要地冗长和缓慢,但我不知道任何替代方法。是否有一些列表推导或替代函数的组合可以以更快、更 Python 的方式完成相同的结果?
编辑:V 的值并不总是像 V10^i 那样简单,给定的向量仅用于演示。这些值可以被认为是任意的(从另一种方法生成,没有像 10^i 这样的可复制模式)。
【问题讨论】:
-
我不懂逻辑。
[6]来自哪里? -
欢迎来到 Stack Overflow!如果代码有效并且您正在寻找改进它的建议,Code Review 是合适的地方。但请先查看codereview.meta.stackexchange.com/questions/5777/…。
-
我理解以下正确吗:对于第一个向量,它采用第一个
len(bolean vector)元素。对于剩余的向量,如果布尔向量中的值为零,则它只取 V 中与构造向量中相同位置的数字。如果它在布尔向量中为 1,则从 V 中获取下一个尚未添加的元素。 -
您确定输入正确吗?
50和500不是不见了吗? -
Barmar:[6] 是第一次需要“新元素”。由于原始数组有 6 个元素,索引为 0:5,第一个向量之后的第一次拉出新元素的向量将从位置 6 开始。第二次需要新值时将从位置 7 开始,依此类推。蜘蛛说得对。 Mozway:永远不需要 50 和 500,因为该元素是“共享的”,或者始终是该位置的第一个向量的值。
标签: python python-3.x numpy