numpy вместо строки не рекомендуется использовать frombuffer - PullRequest
1 голос
/ 20 февраля 2020

В коде Python, используя numpy 1.18.1

`def printBoard (self): current = self.player other = self.player% 2 + 1

    currBin   = '{:049b}'.format(self.current_position)
    currRev = currBin[::-1]

    cArr = (np.fromstring(currRev,'u1') - ord('0'))*current

    other_position = self.current_position^self.mask
    othBin   = '{:049b}'.format(other_position)
    othRev = othBin[::-1]

    oArr = (np.fromstring(othRev,'u1') - ord('0'))*other

    tArr =  oArr+cArr

    brd = np.reshape(tArr,(7,7),order = 'F')
    for y in range(bitBoard.HEIGHT,-1,-1):
        for x in range(bitBoard.WIDTH):
            print(brd[y,x],end = ' ')
        print()
    print()
    `

строка:

cArr = (np.fromstring(currRev,'u1') - ord('0'))*current

выдает следующее предупреждение:

DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on    unicode inputs. Use frombuffer instead
  cArr = (np.fromstring(currRev,'u1') - ord('0'))*current

Замена 'fromstring' на 'frombuffer' выдает следующую ошибку:

cArr = (np.frombuffer(currRev,'u1') - ord('0'))*current

TypeError: a bytes-like object is required, not 'str'

Несмотря на некоторые поиски в Google, я не могу найти то, что я должен использовать вместо этого. Кто-нибудь может помочь?

Спасибо.

Алан

1 Ответ

1 голос
/ 20 февраля 2020

Соответствующая часть вашего кода - это то, что производит currRev. Из этого я могу построить этот пример:

In [751]: astr = '{:049b}'.format(123)[::-1]                                                   
In [752]: astr                                                                                 
Out[752]: '1101111000000000000000000000000000000000000000000'

ваше предупреждение:

In [753]: np.fromstring(astr, 'u1')                                                            
/usr/local/bin/ipython3:1: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  #!/usr/bin/python3
Out[753]: 
array([49, 49, 48, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
       48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
       48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48],
      dtype=uint8)

frombuffer хочет использовать строку байтов, поэтому давайте создадим ее:

In [754]: astr.encode()                                                                        
Out[754]: b'1101111000000000000000000000000000000000000000000'
In [755]: np.frombuffer(astr.encode(),'u1')                                                    
Out[755]: 
array([49, 49, 48, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
       48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
       48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48],
      dtype=uint8)

И остальная часть строки:

In [756]: _-ord('0')                                                                           
Out[756]: 
array([1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0], dtype=uint8)

Другой способ получить тот же массив:

In [758]: np.array(list(astr),'uint8')                                                         
Out[758]: 
array([1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0], dtype=uint8)
...