web-dev-qa-db-ja.com

シーケンスで作成するnumpy配列

私は、MATLABからscipy(+ numpy)+ matplotlibへの移行の途中です。いくつかのことを実装するとき、私は問題を抱え続けます。 3つの異なる部分で単純なベクトル配列を作成したいと思います。 MATLABでは、次のようにします。

vector=[0.2,1:60,60.8];

これにより、62の位置を持つ1次元配列が作成されます。私はこれをscipyを使って実装しようとしています。私が今最も近いのはこれです:

a=[[0.2],linspace(1,60,60),[60.8]]

ただし、これは配列ではなくリストを作成するため、ベクトル配列に再形成することはできません。しかし、これを行うとエラーが発生します

a=array([[0.2],linspace(1,60,60),[60.8]])
ValueError: setting an array element with a sequence.

私の主な障害は、MATLABでこの単純な演算を変換する方法がわからないことです。

a=[1:2:20];

numpyに。配列を作成するときではありませんが、配列内の位置にアクセスする方法を知っています。どんな助けでも感謝します、ありがとう!

17
lllllll

まあNumPyは、MATLABの配列作成関数、vectorを、two関数を使用して実装します1つではなく、それぞれがconcatenationが発生するはずの特定の軸を暗黙的に指定します。これらの機能は次のとおりです。

  • r _(行単位の連結)および

  • c _(列ごと)


したがって、例として、相当するNumPyは次のとおりです。

>>> import numpy as NP

>>> v = NP.r_[.2, 1:10, 60.8]

>>> print(v)
     [  0.2   1.    2.    3.    4.    5.    6.    7.    8.    9.   60.8]

列ごとの対応は次のとおりです。

>>> NP.c_[.2, 1:10, 60.8]

slice表記は期待どおりに機能します[start:stop:step]:

>>> v = NP.r_[.2, 1:25:7, 60.8]

>>> v
  array([  0.2,   1. ,   8. ,  15. ,  22. ,  60.8])

虚数を3番目の引数として使用すると、スライス表記はlinspace

>>> v = NP.r_[.2, 1:25:7j, 60.8]

>>> v
  array([  0.2,   1. ,   5. ,   9. ,  13. ,  17. ,  21. ,  25. ,  60.8])


それ以外の場合は、arangeのように動作します。

>>> v = NP.r_[.2, 1:25:7, 60.8]

>>> v
  array([  0.2,   1. ,   8. ,  15. ,  22. ,  60.8])
15
doug

あなたは次のようなことを試すことができます:

a = np.hstack(([0.2],np.linspace(1,60,60),[60.8]))
5
JoshAdel
np.concatenate([[.2], linspace(1,60,60), [60.8]])
3
Fred Foo

arange(0.2,60.8,0.2)はあなたが望むことをしますか?

http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html

3
manuel

あなたが言ったこれらのセグメント化された範囲を構築するアイデアがどういうわけか私は好きです。あなたがそれらをたくさん使うなら、おそらく小さな関数

import numpy as np

def segrange(*args):
    result = []
    for arg in args:
        if hasattr(arg,'__iter__'):
            result.append(range(*arg))
        else:
            result.append([arg])
    return np.concatenate(result)

それはあなたに与える

>>> segrange(1., (2,5), (5,10,2))
[ 1.  2.  3.  4.  5.  7.  9.]

あるといいですね。しかし、おそらくconcatenate/hstackを使用して答えを探します。

2
pwuertz

見て - np.r_ 。これは基本的に他の誰もが提案したものと同等ですが、MATLABの場合は少し直感的です(他の言語の場合は少し直感的ではありません)。

例として、vector=[0.2,1:60,60.8];は以下に変換されます:

vector = np.r_[0.2, 1:61, 60.8]
1
Joe Kington

コロンでnp.r_配列を作成し、それを使用してインデックスを作成できることを、MATLABからNumpyに移行する他の人に指摘したいだけです。

たとえば、MATLABにいる場合

arr_ones = ones(10,10)

またはNumpyで

arr_ones = np.ones([10,10])

Matlabでは、次のように列1から5だけでなく、7だけを取ることができます。

arr_ones(:,[1:5 7])

Numpyで同じことをすることは(少なくとも私にとって)直感的ではありません。これにより、「無効な構文」エラーが発生します。

arr_ones[:,[1:5,7]]

ただし、これは機能します:

inds = np.r[1:5,]
arr_ones[:,inds]

これは技術的には新しい答えではありませんが、マトリックスにインデックスを付けるときにコロンを使用して配列を構築するのはMatlabでとても自然に思えるので、このページにアクセスする多くの人がこれを知りたいと思っています。 (私は新しい質問をする代わりにここに来ました。)

1
NickleDave

私がMATLABを正しく理解していれば、次のようにしてこのようなことを達成できます:

_a=np.array([0.2]+list(range(1,61))+[60.8])
_

しかし、おそらくもっと良い方法があります...python 2.Xを使用している場合、list(range(1,61))range(1,61)になる可能性があります。

これは、3つのリストを作成し、_+_演算子を使用してそれらを連結することで機能します。

最初の試みがうまくいかなかった理由は、

a=[ [0.2], np.linspace(1,60,60), [60.8] ]はリストのリストを作成します-言い換えると:

_a[0] == [0.2] #another list (length 1)
a[1] == np.linspace(1,60,60) #an array (length 60)
a[2] == [60.8] #another list (length 1)
_

array関数は、シーケンスであるイテラブル、または同じ長さのシーケンスのシーケンスを期待します。

1
mgilson

numpy.repeat()を使用する最も簡単な方法||| numpy.tile()

a = np.array([1,2,3,4,5])

np.r_[np.repeat(a,3),np.tile(a,3)]
0
Sunil