2

次のコマンドを使用して、長さが等しくない2つの配列を結合しました。

allorders = map(None,todayorders, lastyearorders)

ここで、「none」は、todayordersに値がない場合に指定されます(todayorders配列はそれほど長くないため)。

ただし、allorders配列をmatplotlib棒グラフに渡そうとすると次のようになります。

 p10= plt.bar(ind, allorders[9],   width, color='#0000DD', bottom=allorders[8])

..次のエラーが発生します:

TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'

それで、matplotlibがno​​neデータ型を受け入れる方法はありますか?そうでない場合、allorders配列の「Nones」をゼロに置き換えるにはどうすればよいですか?

可能であれば、私はPythonの初心者(Rコミュニティからやってくる)なので、使用/テストできる詳細なコードを最初から最後まで提供してください。

4

3 に答える 3

8

リスト内包表記を使用します。

allorders = [i if i[0] is not None else (0, i[1]) for i in allorders]
于 2012-12-27T20:30:36.117 に答える
5

numpyの場合:

import numpy as np
allorders = np.array(allorders)

これにより、Noneが原因でオブジェクトの配列が作成されます。それらをゼロに置き換えることができます。

allorders[allorders == None] = 0

次に、配列を適切なタイプに変換します。

allorders.astype(int)
于 2017-11-01T19:29:32.067 に答える
4

これをすべて入れたいように思われるのでnumpy、質問に対する直接の答えは実際には脇に置いてあり、正しい答えは「もちろん…」の段落までありません。

あなたがそれについて考えるならば、Pythonには。がないので、あなたは最初のパラメータをとして使用mapしています。ただし、に1つあり、カスタムを指定できます。したがって、これをすべて1つのステップで実行できます。Nonezip_longestzip_longestitertoolsfillvalueizip_longest

>>> import itertools
>>> todayorders = [1, 2]
>>> lastyearorders = [1, 2, 3]
>>> allorders = itertools.izip_longest(todayorders, lastyearorders, fillvalue=0)
>>> list(allorders)
[(1, 1), (2, 2), (0, 3)]

これは、短いリストの追加の値として表示されるを入力0するだけです。すべてNoneに置き換えたい場合は、MartijnPietersの方法で行う必要があります。しかし、私はこれがあなたが望むものだと思います。 None0

list(allorders)また、最後に:izip_longestは、のほとんどのものと同様にitertools、ではなくイテレータを返すことに注意してくださいlist。または、よく知っているかもしれませんが、「厳密な」シーケンスではなく「怠惰な」シーケンスを返します。結果を繰り返すだけの場合は、実際にはそれが優れていますが、list(人間が読める形式で印刷する、またはallorders[9]例のようににアクセスするなど)を必要とする関数で使用する必要がある場合は、最初に明示的に変換する必要があります。

numpy.arrayではなく実際に必要な場合は、最初listに通過することなく、直接そこに到達できます。list(これから行うのがそれだけの場合はmatplotlib、おそらく必要ですarray。)最も明確な方法は、np.fromiter(allorders)の代わりに使用することですlist(allorders)dtype=int明示的(または適切なもの)を渡すことをお勧めします。また、サイズがわかっている場合(これはそうですmax(len(todayorders), len(lastyearorders)))、場合によっては、明示的なものを渡す方が高速または簡単countです。

もちろん、何かがnumpy魅力的に聞こえる場合は、またはnumpyを使用するのではなく、そもそもその範囲内にとどまる必要があります。mapizip_longest

>>> todayorders.resize(lastyearorders.shape)
>>> allorders = np.vstack(todayorders, lastyearorders).transpose()

残念ながら、それは変化todayordersします。私が知る限り、同等の不変関数numpy.resizeは「ゼロ拡張」する方法を提供しませんが、代わりに値を繰り返します。うまくいけば、私は間違っていて、誰かが簡単な方法を提案するでしょうが、そうでなければ、あなたはそれを明示的にしなければなりません:

>>> extrazeros = np.zeros(len(lastyearorders) - len(todayorders), dtype=int)
>>> allorders = np.vstack(np.concatenate((todayorders, extrazeros)), lastyearorders)
>>> allorders = allorders.transpose()
array([[ 1,  1],
       [ 2,  2],
       [ 0,  3]])

もちろん、それをたくさん行う場合は、zeroextend配列のペアを取り、一方を他方に一致するように拡張する関数を作成します(または、1Dだけを扱っているのではない場合は、各軸の短い方の配列をに拡張します他を作る)。

mapいずれにせよ、、などを使用するよりも高速で一時メモリの使用量が少ないことを除けば、これは、 (ではなく)izip_longest右の最終配列になることも意味します。つまり、結果の長期メモリの使用量も少なくなります。 、そしてそれ以降に行うことはすべて高速になり、一時メモリの使用量も少なくなります。dtypeintobject

完全を期すために:ハンドル値を持つこと可能ですが、それはあなたが望むものではないと思います。たとえば、メソッドがに変換されるオブジェクトを渡すことができます。しかし、これは事実上Martijn Pietersの答えと同じですが、はるかに冗長であり、そのような配列を大量にプロットする必要がない限り、まったく利点はありません。pyplotNoneTransformtransformNone0

于 2012-12-27T20:47:04.793 に答える