2

私が行った場合

a = [1, 2, 7]
a - a[-1]

私は得るTypeError: unsupported operand type(s) for -: 'list' and 'int'

ただし、 で構成されたリストbnp.float64あり、次のコードが機能します。

type(b)
# list
b - b[-1]
# array([ 281.04209146,    6.57013103,    0.        ])

bこれは、 の数字がでありnp.float64、 にb多少キャストされているためだと思いますnp.array。その後、ブロードキャストが発生します。リスト内のすべての要素が同じ型である必要はないためb[0]、 string だったらどうなるでしょうか? のオペランド b - b[-1]は依然としてlistandだったはずなのに、np.float64なぜ がb - b[-1]発生しないのTypeErrorですか?

EDITlist :とnp.arrayは違うと答えた人がいます。まあ、私は知っています。しかし、ありbませんnp.array。のように動作listしていますが、コード スニペットで述べたように、その型はです。

の最小限の作業例を次に示しbます。

b
# [1598.717274996219, 1324.245314569733, 1317.6751835362861]
type(b[0])
# numpy.float64
4

2 に答える 2

2

のような式A-Bでは、インタプリタはそれをA.__sub__(B)またはとして実装できますB.__rsub__(A)

リストは実装しますが、実装muladdませんsub

In [29]: [1,2,3]*3
Out[29]: [1, 2, 3, 1, 2, 3, 1, 2, 3]
In [30]: [1,2,3]+[1]
Out[30]: [1, 2, 3, 1]
In [31]: [1,2,3]-3
TypeError: unsupported operand type(s) for -: 'list' and 'int'

np.ndarrayを実装します__rsub__

In [32]: [1,2,3]-np.array([1,2,3])
Out[32]: array([0, 0, 0])
# np.array([1,2,3]).__rsub__([1,2,3])

そして、そのメソッドは LHS を配列に変換しようとするため、この式は次のようになります。

In [33]: np.asarray([1,2,3]) - np.array([1,2,3])
Out[33]: array([0, 0, 0])

リストに文字列が含まれている場合、これは失敗します。

In [35]: ['a',2,3]-np.array([1,2,3])
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U11') dtype('<U11') dtype('<U11')

そのリストは文字列の配列になるため:

In [36]: np.asarray(['a',2,3])
Out[36]: 
array(['a', '2', '3'], 
      dtype='<U1')

文字列 dtype を使用した配列減算は実装されていません。

配列 RHS で書いたことはすべて、それが の場合に適用されますnp.float64np.float64(10)は (ほとんどのコンテキストで) と同じように動作しnp.array(10.0)ます。

したがって、これらの減算はすべてb同じです。

 b = [np.float64(10), np.float64(1)]
 b - b[-1]
 b - np.float64(1)
 b - np.array(1.0)
 np.array(b) - np.array(1.0)

つまり、RHS がある種の配列である場合、LHS リストも配列に変換されます。そこから、2 つの配列に互換性があるかどうか (形状と dtype) が問題になります。

于 2016-11-28T17:33:58.147 に答える
1

TypeErrorただし、文字列を作成するときは同じではありませんb[0]

b=[np.float_(a_) for a_ in a]

b
Out[4]: [1.0, 2.0, 7.0]

b-b[-1]
Out[5]: array([-6., -5.,  0.])

b[0]='a'

b
Out[7]: ['a', 2.0, 7.0]

b-b[-1]
Traceback (most recent call last):

  File "<#>", line 1, in <module>
    b-b[-1]

TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')

TypeErrorのタイプが一致しない場合は を取得しsubtractます。オリジナルでは、np.float64forを取得するとb[-1]、式全体が numpy 配列にキャストされます。したがってb[-1]、文字列の場合:

b[2]='a'

b-b[-1]
Traceback (most recent call last):

  File "<#>", line 1, in <module>
    b-b[-1]

TypeError: unsupported operand type(s) for -: 'list' and 'str'

あなたは元に戻っていますTypeError

于 2016-11-28T13:00:56.333 に答える