94632


以下の np.array()で作成した行列があります（どのように作成したかは省略し、行列の中身だけ書いています）。

[code]

       a = [-11007  -9748  -7942  -6331  -5511  -5508  -5421  -4330  -3289  -1807]
    
[/code]

この行列の各要素の２乗を求めたいのですが、いくつか方法を試しても  
以下の値が返ってきます。

[code]

        [-22015  -3696  29732 -26471  27953  -5104  27113   5604   4081 -11551]
    
[/code]

"`**`" "`pow()`" "`np.power()`" は試しました。  
Jupyter Notebookを使用しています。  
解決策をご教示いただければ幸いです。  
よろしくお願いいたします。

2023/04/23 追記  
実際の行列は以下のように作成しました。

[code]

    sounds = AudioSegment.from_file('ファイル名.wav', 'wav')
    sig = np.array(sounds.get_array_of_samples())[::sounds.channels]
    a = sig[0:10]
    
[/code]

wavファイルから作成した行列の10番目までの要素を抜き出しています。  
その上で、以下３つのコードを試しました。

[code]

    print(a ** 2)
    print(pow(a, 2)))
    print(np.power(a, 2))
    
[/code]

しかし、いずれのコードも下の値が返ってきます。

[code]

    [-22015  -3696  29732 -26471  27953  -5104  27113   5604   4081 -11551]
    
[/code]

未熟な質問の仕方となり申し訳ありません。  
何卒よろしくお願いいたします。


CC BY-SA 4.0
2023-04-22T06:46:44.863
94612
2023-04-24T08:57:24.900
2023-04-23T07:11:20.880
58022
58022
question
python numpy array
np.array行列の２乗を求めたい。


`**`で出来ませんか。

[code]

    a = np.array([-11007, -9748, -7942, -6331, -5511, -5508, -5421, -4330, -3289, -1807])
    print(a ** 2)
    # array([121154049,  95023504,  63075364,  40081561,  30371121,  30338064,
    #         29387241,  18748900,  10817521,   3265249], dtype=int32)
    
[/code]

上記のようにならないのであれば、質問の状況が再現するコードを提示してください。

* * *

【追記】  
手元のwavファイルで質問のコードを試したところnumpy配列の型がint16になっていましたのでその型で表現できる範囲になってしまっていたのが、思った通りの計算結果にならなかった原因かと思います。

下記のようにすることでも計算できるかと思います。

[code]

    print(a.astype(float) ** 2)
    
[/code]


CC BY-SA 4.0
2023-04-22T07:09:26.333
94613
2023-04-23T09:19:39.827
2023-04-23T09:19:39.827
39819
39819
94612
answer


(既に回答あるけれど)  
`.get_array_of_samples()` で得た arrayは  
@merino 氏の回答にあるように 'h': signed short (2バイト) のようです

[code]

    from pydub import AudioSegment
    
    sound = AudioSegment.from_wav("sample_data/test.wav")
    arr = sound.get_array_of_samples()
    display(type(song), type(arr))
    # pydub.audio_segment.AudioSegment
    # array.array
    
    print(sound.array_type, arr.typecode)
    # h h
    
[/code]

そのまま演算すると, 場合によってはオーバーするので少し大きめの型への変換が必要  
速度的には `np.int32` や `np.int64` がよいかも？

[code]

    import numpy as np
    print(arr[:10])
    display(np.array(arr[:10]) **2)   # ⇐ 二乗してもマイナスが現れる
    display(np.array(arr[:10], dtype=np.int64) **2)
    display(np.array(arr[:10].tolist()) **2)
    
    # array('h', [-160, 107, 71, -491, 646, -161, -546, 752, -473, 324])
    # array([ 25600,  11449,   5041, -21063,  24100,  25921, -29564, -24320,
    #         27121, -26096], dtype=int16)
    # array([ 25600,  11449,   5041, 241081, 417316,  25921, 298116, 565504,
    #        223729, 104976])
    # array([ 25600,  11449,   5041, 241081, 417316,  25921, 298116, 565504,
    #        223729, 104976])
    
    
    # 速度比較: 以下は Jupyterや colabで実行可能
    %timeit np.array(arr, dtype=np.int64) **2
    %timeit np.array(arr.tolist()) **2
    
    # 5.76 µs ± 171 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    # 649 µs ± 148 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
[/code]


CC BY-SA 4.0
2023-04-24T08:57:24.900
94632
2023-04-24T08:57:24.900
43025
94612
answer