Generate a matrix from a row vector and a column vector numpy

Generate a matrix from a row vector and a column vector numpy – StackOverflow

numpyを使って,と言っているし,tupleにこだわりは無いとする.
(tupleにこだわるなら,内包表記やmap)

割と簡単にできる.

まず,(すぐに思い付くもの(つまり低次元)で)似たものを作る.

import numpy as np

a = [ (0,0,255), (0,0,0), (0,255,0), (255,0,0) ]
b = [ (0,0,255), (0,0,0), (0,255,0), (255,0,0) ]
np_a = np.array(a)
np_b = np.array(b)

ravel_a = np.ones((4, 12)) * np_a.ravel()
np.concatenate([np_b, ravel_a], axis=1)

array([[ 0., 0., 255., 0., 0., 255., 0., 0., 0.,
0., 255., 0., 255., 0., 0.],
[ 0., 0., 0., 0., 0., 255., 0., 0., 0.,
0., 255., 0., 255., 0., 0.],
[ 0., 255., 0., 0., 0., 255., 0., 0., 0.,
0., 255., 0., 255., 0., 0.],
[ 255., 0., 0., 0., 0., 255., 0., 0., 0.,
0., 255., 0., 255., 0., 0.]])

これのシャープは(4, 15).質問者が求めているのは(4, 5, 3).

結局,形だけの話だから,リシャープすれば良い.

np.concatenate([np_b, ravel_a], axis=1).reshape(4, 5, 3)

array([[[ 0., 0., 255.],
[ 0., 0., 255.],
[ 0., 0., 0.],
[ 0., 255., 0.],
[ 255., 0., 0.]],

   [[   0.,    0.,    0.],
    [   0.,    0.,  255.],
    [   0.,    0.,    0.],
    [   0.,  255.,    0.],
    [ 255.,    0.,    0.]],

   [[   0.,  255.,    0.],
    [   0.,    0.,  255.],
    [   0.,    0.,    0.],
    [   0.,  255.,    0.],
    [ 255.,    0.,    0.]],

   [[ 255.,    0.,    0.],
    [   0.,    0.,  255.],
    [   0.,    0.,    0.],
    [   0.,  255.,    0.],
    [ 255.,    0.,    0.]]])

できた.

ブロードキャストを使いこなせれば,もっと上手く出来るのだろうか.
(「np.ones((4, 12)) * np_a.ravel()」の部分が少し不格好)

後,そもそも2つのアレイと言いつつ,ものは一緒なので,
numpy.lib.stride_tricks.as_stridedを使いこなせればもっとエレガントにできそう.

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中