使用numpy.fromfunction()获取3D数组输出时出现问题

kyxcudwk  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(75)

我在尝试获取3D数组作为输出时,使用numpy.fromfunction()函数时遇到问题。

我在lambda(i,j,k)中使用了3个参数,它们应该只是索引-(int,int,int)。相反,我得到了3个形状为(100,100)的numpy数组,因此:

i.shape = (100, 100)
    j.shape = (100, 100)
    k.shape = (100, 100)

它崩溃了我的lambda函数,因为它需要3个singe int才能工作...
我使用了一个类似于文档中的函数,但是是三维的。错误是numpy实现中的错误吗?https://numpy.org/doc/stable/reference/generated/numpy.fromfunction.html#numpy.fromfunction
文档还说-“因此,结果数组在坐标(x,y,z)处具有值fn(x,y,z)。”
下面是部分代码:

check_reset_flag_fun = lambda i,j,k: self.dist_p_to_plane([i,j,k], plane_equation) > min_dist
    reset_flag_mtx = np.fromfunction(check_reset_flag_fun, (100,100,100), dtype=int)
    matrix[reset_flag_mtx] = reset_val
vtwuwzda

vtwuwzda1#

我同意hpaulj的答案,但我仍然认为文档中的这一行可能会产生误导:
因此,所得数组在坐标(x,y,z)处具有值fn(x,y,z)。
其结果是fn(X,Y,Z),其中X,Y,Z是由给定形状的np个指数函数得到的指数阵列。
我不满意的解决方案,这是相当混乱,但这里是我的代码:

check_reset_flag_fun = lambda i,j,k: self.dist_p_to_plane([i,j,k], plane_equation) > min_dist
def mapper(X, Y, Z):
    return np.array(list(map(check_reset_flag_fun, X.flatten(), Y.flatten(), Z.flatten()))).reshape((100,100,100))
            
reset_flag_mtx = np.fromfunction(mapper, (100,100,100), dtype=int)
b_result[reset_flag_mtx] = reset_val

如果没有np.fromfunction:

check_reset_flag_fun = lambda i,j,k: self.dist_p_to_plane([i,j,k], plane_equation) > min_dist
X, Y, Z = np.indices((100,100,100))
reset_flag_mtx = np.array(list(map(check_reset_flag_fun, X.flatten(), Y.flatten(), Z.flatten()))).reshape((100,100,100))
b_result[reset_flag_mtx] = reset_val

下面是解释np.fromfunction如何工作的有趣代码:

def fun(i, j):
    print("i shape\n", i.shape)
    print("j shape\n", j.shape)
    print("i\n", i)
    print("j\n", j)
    return i

res = np.fromfunction(lambda i, j: fun(i,j), (2, 2), dtype=float)
print("res\n", res)

输出:

i shape
 (2, 2)
j shape
 (2, 2)
i
 [[0. 0.]
 [1. 1.]]
j
 [[0. 1.]
 [0. 1.]]
res
 [[0. 0.]
 [1. 1.]]

相关问题