17

私は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];

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

4

9 に答える 9

16

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

  • 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]

スライス表記は期待どおりに機能します[ 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])
于 2012-05-26T11:11:37.520 に答える
5

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

a = np.hstack(([0.2],np.linspace(1,60,60),[60.8]))
于 2012-05-25T11:31:35.803 に答える
3

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

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

于 2012-05-25T11:57:13.850 に答える
3
np.concatenate([[.2], linspace(1,60,60), [60.8]])
于 2012-05-25T11:32:36.720 に答える
2

私はどういうわけかあなたが言及したこれらのセグメント化された範囲を構築するという考えが好きです。あなたがそれらをたくさん使うなら、多分次のような小さな関数

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を使用して答えを探します。

于 2012-05-25T12:20:51.070 に答える
1

私がmatlabを正しく理解していれば、次を使用して次のようなことを達成できます。

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

しかし、おそらくもっと良い方法があります... python2.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関数は、シーケンスであるiterable、または同じ長さのシーケンスのシーケンスを想定しています。

于 2012-05-25T11:31:54.430 に答える
1

をご覧くださいnp.r_。これは基本的に他の人が提案していることと同じですが、matlabから来ている場合は、もう少し直感的です(他の言語から来ている場合は、少し直感に反します)。

例として、次のようにvector=[0.2,1:60,60.8];変換されます。

vector = np.r_[0.2, 1:61, 60.8]
于 2012-05-25T20:11:26.243 に答える
1

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

たとえば、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では、行列にインデックスを付けるときにコロンを使用して配列を作成するのは自然なことのように思われるので、このページにアクセスする多くの人がこれを知りたいと思うでしょう。(私は新しい質問をする代わりにここに来ました。)

于 2016-01-13T06:07:25.767 に答える
0

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

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

np.r_[np.repeat(a,3),np.tile(a,3)]
于 2019-05-04T02:26:48.883 に答える