numpyで配列に単一の要素を追加する


122

私は以下を含む派手な配列を持っています:

[1, 2, 3]

以下を含む配列を作成したい:

[1, 2, 3, 1]

つまり、配列の最後に最初の要素を追加します。

私は明白なことを試しました:

np.concatenate((a, a[0]))

しかし、私は言ってエラーが出ます ValueError: arrays must have same number of dimensions

私はこれを理解していません-配列はどちらも単なる1d配列です。


1
np.insert([1,2,3], 3, 1)
Sparkler 2017

回答:


163

append() 要素が追加された古い配列である新しい配列を作成します。

要素を追加するための適切な方法を使用するのがより普通だと思います:

a = numpy.append(a, a[0])

29
このコマンドはaアレイを変更しません。ただし、新しい変更された配列を返します。したがって、a 変更が必要な場合a = numpy.append(a,a[0])は、使用する必要があります。
Amjad 2017年

np.append使用しnp.concatenateます。アドオンに1つの次元があることを確認するだけです。OPエラーは、a[0]次元が0 でした。
hpaulj

要素を1つだけ追加したいのに、なぜappendはまったく新しい配列を作成するのですか?
ed22

このような単純なコマンドで別の関数を呼び出す必要があるという事実は好きではありません。配列自体にのような内部メソッドa.append(1)a.add(1)またはリストのようなものさえあればa + [1]
Fernando Wittmann

17

一度だけまたは時々追加する場合np.appendは、配列での使用で問題ありません。このアプローチの欠点は、呼び出されるたびにメモリが完全に新しい配列に割り当てられることです。大量のサンプルで配列を拡大する場合は、配列を事前に割り当てるか(合計サイズがわかっている場合)、リストに追加して後で配列に変換することをお勧めします。

使用np.append

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

後でpythonリストを使用して配列に変換する:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

numpy配列を事前に割り当てます:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

最終的なサイズが不明な場合、事前割り当てが困難な場合、50のチャンクで事前割り当てを試行しましたが、リストを使用することに近づきませんでした。

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]は配列ではありません。これはの最初の要素であるaため、次元を持ちません。

a[0:1]代わりに使用してみてください。これはa、単一の項目配列内の最初の要素を返します。


12

これを試して:

np.concatenate((a, np.array([a[0]])))

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

concatenateは、両方の要素が派手な配列である必要があります。ただし、a [0]は配列ではありません。それが機能しない理由です。


または、もっと簡単にnp.concatenate((a, [a[0]]))。とにかく、リストは自動的に配列型に昇格され、入力を省略できます。
Mad Physicist

10

このコマンド、

numpy.append(a, a[0])

a配列は変更されません。ただし、新しい変更された配列を返します。したがって、a変更が必要な場合は、以下を使用する必要があります。

a = numpy.append(a, a[0])


3

これは少しやり過ぎかもしれませんが、np.takeラップアラウンドインデックスには常に関数を使用します。

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])

2

さんが言ってみましょうa=[1,2,3]、あなたはそれになりたいです[1,2,3,1]

組み込みの追加機能を使用できます

np.append(a,1)

ここで1はintです。これは文字列であり、配列の要素に属している場合と属していない場合があります。プリント:[1,2,3,1]


StackOverflowへようこそ!あなたは読むことをお勧めしますこのガイドをどのようにフォーマットコードににして、それが読みやすくなるように、あなたの答えを更新:)また、これは、いくつかの新しいものに答えるために、より良い、受け入れ答えと非常に古い質問です
0mpurdy

0

要素を追加したい場合は append()

a = numpy.append(a, 1) この場合、配列の最後に1を追加します

要素を挿入したい場合は insert()

a = numpy.insert(a, index, 1) この場合、インデックスを使用して配列内の位置を設定し、1を好きな場所に配置できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.