`coordinate`は、「リストを要素にもつndarray」ということですか?
`np.concatenate(coordinate).shape`は`(262144, 3)`になりますか?
`coordinate`の要素が`[x, y, z]`であるとき、それを`voxel[x, y, z]`の値に置換する、という認識であってますか?
1>>>import numpy as np
2>>>import random
3>>>4>>> N =45>>> voxel = np.zeros(N*N*N, dtype=object)6>>>for i inrange(N*N*N):7... voxel[i]=[random.randint(0,255)for i inrange(3)]8...9>>> voxel = voxel.reshape(N,N,N)10>>>print(voxel)11[[[list([149,18,49])list([220,1,186])list([168,111,239])12list([105,140,107])]13[list([110,181,29])list([203,197,147])list([185,157,219])14list([133,123,114])]15[list([198,89,152])list([131,62,104])list([12,185,234])16list([88,82,84])]17[list([138,215,119])list([136,117,121])list([158,98,121])18list([13,181,209])]]1920[[list([172,0,153])list([132,39,155])list([105,190,101])21list([240,192,199])]22[list([38,254,24])list([9,69,173])list([211,89,210])23list([223,159,43])]24[list([42,92,125])list([101,194,24])list([134,215,16])25list([54,176,51])]26[list([168,116,18])list([94,81,49])list([192,41,45])27list([137,182,178])]]2829[[list([31,68,194])list([174,1,104])list([236,63,160])30list([19,20,44])]31[list([238,60,184])list([172,106,34])list([121,173,227])32list([198,145,202])]33[list([183,225,163])list([93,101,74])list([166,39,45])34list([69,169,247])]35[list([195,47,140])list([205,195,218])list([142,240,180])36list([230,50,121])]]3738[[list([174,5,140])list([157,144,74])list([206,86,223])39list([121,40,95])]40[list([158,68,102])list([3,42,87])list([61,76,57])41list([2,77,103])]42[list([216,241,127])list([175,45,225])list([11,153,174])43list([199,98,154])]44[list([192,174,217])list([12,36,70])list([72,164,22])45list([18,121,128])]]]
次にcoordinateを作ります。
python
1>>> coordinate = np.zeros(N*N, dtype=object)2>>>for i inrange(N*N):3... coordinate[i]=[random.randint(0,N-1)for i inrange(3)]4...5>>> coordinate = coordinate.reshape(N,N)6>>>print(coordinate)7[[list([1,1,1])list([2,0,0])list([0,2,3])list([0,2,1])]8[list([1,1,3])list([2,1,2])list([3,3,3])list([0,3,2])]9[list([0,0,1])list([0,0,1])list([1,0,3])list([1,2,0])]10[list([0,1,3])list([0,0,1])list([2,3,2])list([1,3,2])]]
ご回答ありがとうございます。
ご提示の方法をColaboratoryで試してみましたが速度が2倍遅くなりました。実際に必要としているN=512ではご教授頂いた方法では難しいようです。
以下、試したコードです。ボクセル値はRGBではなくGrey値なので一部コードを改変しています。
```python
import numpy as np
import random
N = 512
voxel = np.zeros(N*N*N, dtype=object)
for i in range(N*N*N):
voxel[i] = random.randint(0,255)
voxel = voxel.reshape(N,N,N)
coordinate = np.zeros(N*N, dtype=object)
for i in range(N*N):
coordinate[i] = [random.randint(0,N-1) for i in range(3)]
def test1():
coordinate = coordinate.reshape(N,N)
coordinate_a = np.array( list(coordinate.reshape(-1))).reshape(N,N,3)
coordinate_s = (coordinate_a[:, :, 0]*(N*N) + coordinate_a[:, :, 1]*N + coordinate_a[:,:,2]).reshape(-1)
imgAry = voxel.reshape(-1)[coordinate_s].reshape(N, N)
def test2():
imgAry = np.array( [voxel[ j[0], j[1], j[2] ] for j in coordinate] ).reshape(N,N)
%timeit -n 1 test1()
%timeit -n 1 test2()
'''
1 loop, best of 5: 496 ms per loop
1 loop, best of 5: 233 ms per loop
'''
```