gpt4 book ai didi

python - 填写 numpy ndarray 的最佳方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:49 27 4
gpt4 key购买 nike

我使用以下代码生成带有渐变的图像。我逐个元素访问数组。有更好的方法吗?谢谢。

import cv2
import numpy as np

x = np.ndarray((256,256,3), dtype=np.uint8)
for i in xrange(256):
for j in xrange(256):
for k in xrange(3):
x[i, j, k] = i
cv2.imwrite('SYxmp_out.jpg', x)

最佳答案

看来您的目标是用 i 填充 x[i, j, k] 用于 i 的所有值, jk

你可以构造这样的数组:

x = np.repeat(np.arange(256, dtype=np.uint8), (256*3)).reshape(256, 256, 3)

然后我们得到一个如下所示的数组:

>>> np.repeat(np.arange(256, dtype=np.uint8), (256*3)).reshape(256, 256, 3)
array([[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
...,
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]],

[[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1],
...,
[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1]],

[[ 2, 2, 2],
[ 2, 2, 2],
[ 2, 2, 2],
...,
[ 2, 2, 2],
[ 2, 2, 2],
[ 2, 2, 2]],

...,

[[253, 253, 253],
[253, 253, 253],
[253, 253, 253],
...,
[253, 253, 253],
[253, 253, 253],
[253, 253, 253]],

[[254, 254, 254],
[254, 254, 254],
[254, 254, 254],
...,
[254, 254, 254],
[254, 254, 254],
[254, 254, 254]],

[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]], dtype=uint8)

对于第二个轴,我们可以使用np.tile:

>>> np.tile(np.repeat(np.arange(256, dtype=np.uint8), 3), 256).reshape(256, 256, 3)
array([[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]],

[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]],

[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]],

...,

[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]],

[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]],

[[ 0, 0, 0],
[ 1, 1, 1],
[ 2, 2, 2],
...,
[253, 253, 253],
[254, 254, 254],
[255, 255, 255]]], dtype=uint8)

尽管如果事情更复杂,广播可能是更好的主意。例如,对于第一个维度,我们可以使用:

x = np.zeros((256, 256, 3))
x[:] = np.arange(256)[:,None,None]

而对于第二个,我们可以利用:

x = np.zeros((256, 256, 3))
x[:] = np.arange(256)[None,:,None]

或者不提及 256 两次:

而对于第二个,我们可以利用:

x = np.zeros((256, 256, 3))
x[:] = np.arange(x.shape[0])[:,None,None]

# second dimension
x = np.zeros((256, 256, 3))
x[:] = np.arange(x.shape[1])[None,:,None]

基准:

如果我运行问题中的代码 (f)、答案中的代码 (g) 和广播版本 (h) 在 i7-7500U CPU @ 2.70GHz 上运行一百次,我获得了以下基准:

>>> timeit(f, number=100)
3.1465475099976175
>>> timeit(g, number=100)
0.05008594098035246
>>> timeit(h, number=100)
0.03603723298874684

所以这应该意味着 gf 大约提速 62 倍,h 提速大约 87 倍>f.

关于python - 填写 numpy ndarray 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57936289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com