1

次の寸法 x、y、z の 2 つの画像があります。

img_a: 50、50、100

img_b: 50, 50

インデックスは画像全体で変化するため、img_a の z-dim を 100 から 1 に減らしたいと思います。値だけを img_b に格納されているインデックスと一致するように取得します。

これにより、次の寸法の 3 番目の画像が生成されます。

img_c: 50, 50

この問題に対処する関数は既にありますか?

ありがとう、ピーター

4

1 に答える 1

0

ベクトル化された方法で更新されました。

これは重複した質問ですが、現在、行と列のサイズが同じでない場合、解決策は機能しません。

以下のコードには、ルックアップ用のインデックスを明示的に作成numpy.indices()し、ループ ロジックをベクトル化された方法で実行する、私が追加したメソッドがあります。メソッドよりも少し遅い(2倍)ですが、numpy.meshgrid()理解しやすく、行と列のサイズが等しくない場合でも機能すると思います。

タイミングはおおよそですが、私のシステムでは次のようになります。

Meshgrid time: 0.319000005722
Indices time: 0.704999923706
Loops time: 13.3789999485

-

import numpy as np
import time


x_dim = 5000
y_dim = 5000
channels = 3

# base data
a = np.random.randint(1, 1000, (x_dim, y_dim, channels))
b = np.random.randint(0, channels, (x_dim, y_dim))


# meshgrid method (from here https://stackoverflow.com/a/27281566/377366 )
start_time = time.time()
i1, i0 = np.meshgrid(xrange(x_dim), xrange(y_dim), sparse=True)
c_by_meshgrid = a[i0, i1, b]
print('Meshgrid time: {}'.format(time.time() - start_time))

# indices method (this is the vectorized method that does what you want)
start_time = time.time()
b_indices = np.indices(b.shape)
c_by_indices = a[b_indices[0], b_indices[1], b[b_indices[0], b_indices[1]]]
print('Indices time: {}'.format(time.time() - start_time))

# loops method
start_time = time.time()
c_by_loops = np.zeros((x_dim, y_dim), np.intp)
for i in xrange(x_dim):
    for j in xrange(y_dim):
        c_by_loops[i, j] = a[i, j, b[i, j]]
print('Loops time: {}'.format(time.time() - start_time))


# confirm correctness
print('Meshgrid method matches loops: {}'.format(np.all(c_by_meshgrid == c_by_loops)))
print('Loop method matches loops: {}'.format(np.all(c_by_indices == c_by_loops)))
于 2015-09-26T11:02:47.803 に答える