仅使用numpy函数(不进行迭代/循环)基于两个数组的信息创建第三个数组

时间:2019-07-11 12:23:01

标签: python numpy

我有一个复杂的函数,该函数接受两个参数x和y并返回整数值i。信息i保存在形状为(200,200)的numpy数组FF中。 FF中的元素值i在0到39999之间,并且在整个数组中未分配两次。 数组FF是预先计算的,在创建数组SF时存在。 (请参见下文)其他信息:复杂函数计算qrcode的NxN矩阵中位的位置,可以针对每个qrcode版本和ecc预先计算该位

第二个函数,它使用函数SF [i]创建布尔值的一维数组SF,因此其形状为(40000,)。 数组是用

创建的
SF = numpy.fromfunction((lambda i: ((data[i >> 3] >> 7 - (i & 7)) & 1 != 0)), (40000,))

,其中data []是具有字节的数组。 (其他信息:该函数将每个字节的每一位评估为true或false。)

重要的是: FF [x] [y] = i 描述了所需信息在SF阵列中的位置。

我的问题

是否有集成的FAST numpy函数(或NUMPY函数的连续应用程序),该函数可以(不使用慢速的python迭代,枚举或for循环)组合两个数组FF和SF,从而创建目标数组TARGET(像SF [(FF [x] [y])])一样?

import numpy as np

FF = np.arange(40000)
np.random.shuffle(FF)
#  FF = FF.reshape((200, 200))  # Only to understand 200x200 = 40000
FF = FF.reshape((40000,))

SF = np.random.choice(2, size=40000).astype(bool)  # Create Array with random boolean
TARGET = np.zeros((40000,), dtype=bool)  # Create Target array

for index in range(40000):  # This for should be replaced with numpy to create TARGET
    pos_in_SF_array = FF[index]  # get position in Second array out of First array at position 0..39999
    value_true_false_at_pos = SF[pos_in_SF_array]  # get True or False at the desired position
    TARGET[index] = value_true_false_at_pos  # Write it at the position index from TARGET

print("Example for take pos in first array and address the value of second array:")
print("Then write the True false in the Target array")
print(FF[12345])
print(SF[FF[12345]])
TARGET[12345] = SF[FF[12345]]  # Assign the Value

TARGET = TARGET.reshape(200, 200)  # Reshape it in the same manner as FF
print(TARGET)

1 个答案:

答案 0 :(得分:0)

好吧,我找到了关于此主题How to get the values from a NumPy array using multiple indices

的最简单解决方案
TARGET2 = (np.take(SF, FF)).reshape(200,200)
print(np.array_equal(TARGET, TARGET2))    # True