Как создать массив указанного измерения определенного типа, инициализированный с тем же значением в Python? - PullRequest
4 голосов
/ 05 августа 2011

Я хочу создать некоторый массив в python массива указанного измерения определенного типа, инициализированного тем же значением. я могу использовать массивы с определенным размером, но я не уверен, как инициализировать их с определенным значением. Конечно, я не хочу использовать нули () или единицы ()

Большое спасибо.

Ответы [ 4 ]

8 голосов
/ 05 августа 2011

Есть много способов сделать это.Первое, что пришло мне в голову, это tile:

>>> numpy.tile(2, 25)
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
       2, 2, 2, 2, 2])

. Вы можете выбрать значение в любой форме:

>>> numpy.tile(2, (5, 5))
array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])

Однако, как указано в ответах нижеэто не самый быстрый метод.Он предназначен для мозаичных массивов любого размера, а не только для отдельных значений, поэтому, если вы действительно хотите просто заполнить массив одним значением, тогда гораздо быстрее сначала выделить массив, а затем использовать назначение срезов:

>>> a = numpy.empty((5, 5), dtype=int)
>>> a[:] = 2
>>> a
array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])

Согласно нескольким тестам, быстрых подходов не существует.Однако два подхода, упомянутых в ответах ниже, одинаково быстрые: ndarray.fill и numpy.full.

Все эти тесты были выполнены в ipython,использование Python 3.6.1 на новом Mac с операционной системой 10.12.6.Определения:

def fill_tile(value, shape):
    return numpy.tile(value, shape)

def fill_assign(value, shape, dtype):
    new = numpy.empty(shape, dtype=dtype)
    new[:] = value
    return new

def fill_fill(value, shape, dtype):
    new = numpy.empty(shape, dtype=dtype)
    new.fill(value)
    return new

def fill_full(value, shape, dtype):
    return numpy.full(shape, value, dtype=dtype)

def fill_plus(value, shape, dtype):
    new = numpy.zeros(shape, dtype=dtype)
    new += value
    return new

def fill_plus_oneline(value, shape, dtype):
    return numpy.zeros(shape, dtype=dtype) + value

for f in [fill_assign, fill_fill, fill_full, fill_plus, fill_plus_oneline]:
    assert (fill_tile(2, (500, 500)) == f(2, (500, 500), int)).all()

tile действительно довольно медленный:

In [3]: %timeit fill_tile(2, (500, 500))
947 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Назначение среза связывается с ndarray.fill и numpy.full для первого места:

In [4]: %timeit fill_assign(2, (500, 500), int)
102 µs ± 1.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [5]: %timeit fill_fill(2, (500, 500), int)
102 µs ± 1.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [6]: %timeit fill_full(2, (500, 500), int)
102 µs ± 1.47 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Добавление, транслируемое на месте, лишь немного медленнее:

In [7]: %timeit fill_plus(2, (500, 500), int)
179 µs ± 3.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

И добавление, не транслируемое на месте, лишь немного медленнее:

In [8]: %timeit fill_plus_oneline(2, (500, 500), int)
213 µs ± 4.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
5 голосов
/ 05 августа 2011

Как насчет:

shape = (100,100)
val = 3.14
dt = np.float
a = np.empty(shape,dtype=dt)
a.fill(val)

Таким образом, вы можете устанавливать параметры и передавать параметры. Кроме того, с точки зрения времени

In [35]: %timeit a=np.empty(shape,dtype=dt); a.fill(val)
100000 loops, best of 3: 13 us per loop

In [36]: %timeit a=np.tile(val,shape)
10000 loops, best of 3: 102 us per loop

Таким образом, использование empty с fill кажется значительно быстрее, чем tile.

2 голосов
/ 12 июня 2014

Начиная с NumPy 1.8, вы можете использовать numpy.full() для достижения этой цели.

>>> import numpy as np
>>> np.full((3,4), 100, dtype = int)
array([[ 100,  100,  100,  100],
       [ 100,  100,  100,  100],
       [ 100,  100,  100,  100]])
0 голосов
/ 05 августа 2011

Вы ищете что-то подобное?

>>> [3 for x in range(10)]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

Вы можете передать полученный массив в numpy.array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...