2016-08-24 5 views
0

Когда я хочу скопировать список без ссылки на один и тот же объект, мне нужно вызвать список. Итак:Что такое эквивалент списка при использовании numpy?

a = [1, 2, 3] 
b = list(a) 

a == b 
True 

a is b 
False 

Что бы эквивалент, когда у меня есть Numpy массива

import numpy 
a = numpy.ones(4) 

b = XXX(a)? 

Заранее спасибо

+6

[ndarray.copy()] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.copy.html) ? – Divakar

+1

В Python 3 объекты 'list' также имеют метод' copy', который, как я думаю, превосходит все другие методы для ясности намерения. –

ответ

-1

Вы можете использовать [:] шаблон, чтобы скопировать список массива или (на самом деле, просто для списков, а не для массивов. См. обновление ниже).

a = np.ones(4) 
b = a[:] 

>>> b 
array([ 1., 1., 1., 1.]) 

>>> id(a) 
4606143744 

>>> id(b) 
4606143984 

Timings

a = np.random.randn(1000000) 

%timeit -n 1000 a.copy() 
1000 loops, best of 3: 1.1 ms per loop 

%timeit -n 1000 a[:] 
1000 loops, best of 3: 659 ns per loop 

Update

я обычно удалить ошибочную запись, как это, но я ухожу, потому что я считаю, что это полезно.

Работает как и ожидалось для списков.

a = [1, 2, 3] 
b = a[:] 
b[2] = 0 

>>> a 
[1, 2, 3] 

>>> b 
[1, 2, 0] 

Но, как указывал @ Divakar, это не кажется, работает для Numpy массивов:

a = np.array([1, 2, 3]) 
b = a[:] 
b[2] = 0 

>>> a 
array([1, 2, 0]) 

>>> b 
array([1, 2, 0]) 

>>> id(a) 
4600986400 

>>> id(b) 
4606142624 

Лучше явно использовать copy() метод (например b = a.copy()).

+0

Он также работает. Но разве это не было дезавуировано при использовании списков? Почему я не помню? Я читал где-то, используя список лучше ... Во всяком случае. Большое спасибо. –

+0

Не 'a [:: 1]' вид 'a' как' np.may_share_memory (a [:: 1], a) 'возвращает' True'? – Divakar

+0

«Возврат True не обязательно означает, что эти два массива разделяют любой элемент. Это просто означает, что они могут». Но на самом деле кажется, что вы можете быть прав ... – Alexander

Смежные вопросы