TypeError: объект 'numpy.uint32' не повторяется при использовании функции numpy.full - PullRequest
0 голосов
/ 02 июня 2019

В некоторых строках огромного скрипта Python есть трехмерный массив из 74537000 элементов, которые являются числами с плавающей точкой:

import numpy as np
prop_shape = [74537000, 3]  # to produce this however a long script is written and this will be printed (just before the controversial line below) in the first run of the code assuming it's a vector quantity like position.
prop_in_dtype = np.float32  # position array with the shape (74537000, 3) is made up of float32 values. In general, however, prop_in_dtype is changing across the script due to the nature of the array

Когда мы пытаемся создать идентичный массив, все элементы которого равны -1, мы можем использовать numpy следующим образом:

.
.
.
my_array = np.full(tuple(prop_shape), -1, prop_in_dtype)
.
.
.

Во время работы у меня появляется следующее сообщение об ошибке:

Traceback (most recent call last):
  File "DLA_DM.py", line 19, in <module>
    settings_centroid.init()
  File "/usr5/username/settings_centroid.py", line 43, in init
    part=gizmo.io.Read.read_snapshots(species, snapshot_value_kind, snapshot_number, simulation_directory='.', snapshot_directory='output/', simulation_name='', properties=properties, element_indices=None, particle_subsample_factor=0, separate_dark_lowres=True, sort_dark_by_id=False, convert_float32=True, host_number=1, assign_host_coordinates=True, assign_host_principal_axes=False, assign_host_orbits=False, assign_formation_coordinates=False, assign_pointers=False, check_properties=True)
  File "/usr5/username/simulation/gizmo/gizmo_io.py", line 649, in read_snapshots
    element_indices, convert_float32, header)
  File "/usr5/username/simulation/gizmo/gizmo_io.py", line 1164, in read_particles
    part[spec_name][prop] = np.full(tuple(prop_shape), - 1, prop_in_dtype) 
TypeError: 'numpy.uint32' object is not iterable

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Я могу воспроизвести сообщение об ошибке с:

In [174]: tuple(np.uint32(1))                                                        
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-174-3420675a1788> in <module>
----> 1 tuple(np.uint32(1))

TypeError: 'numpy.uint32' object is not iterable

Так что я думаю, что с переменной prop_shape что-то не так.

0 голосов
/ 02 июня 2019

prop_shape повторяется в исходном коде. Иногда это одно целое число (для скалярных величин, например, 74537000), а иногда список из двух элементов (для векторных величин, например, [74537000, 3]). Я предполагал, что это фиксированный список из двух элементов (отсюда вектор). Вот почему кортеж одного скаляра даст такую ​​ошибку, если скаляр не float32 d-типа. Чтобы избежать этого, я сделал if statement, где каждый раз он проверяет dtype переменной перед созданием массива:

if isinstance(prop_shape, list):
    my_array = np.full(tuple(prop_shape), -1, prop_in_dtype)
else:
    my_array = np.full(prop_shape, -1, prop_in_dtype)

Однако, как я сказал в своем комментарии к предложению Уоррена, я получаю MemoryError следующим образом:

Traceback (most recent call last):
  File "DLA_DM.py", line 96, in <module>
    gizmo.plot.Image.plot_image(settings_centroid.part, 'dark', 'mass', settings_centroid.image_kind, [0,1], settings_centroid.dimensions_select, settings_centroid.distance_max, settings_centroid.distance_bin_width_generic, distance_bin_number=settings_centroid.distance_bin_number, part_indices=part_indices, write_plot=write_plot, plot_directory=plot_directory, background_color=background_color, use_column_units=False, center_position=settings_centroid.center_position, rotation=settings_centroid.rotation, property_select={'mass.bound':[1e9,1e13]}, subsample_factor=subsample_factor, image_limits=settings_centroid.image_limits_xy, hal=settings_centroid.hal, hal_indices=settings_centroid.hal_indices, hal_position_kind=hal_position_kind, hal_radius_kind=hal_radius_kind, return_halo_info=settings_centroid.return_halo_info_value_dark)
  File "/usr5/username/simulation/gizmo/gizmo_plot.py", line 825, in plot_image
    settings_centroid.init()
  File "/usr5/username/settings_centroid.py", line 43, in init
    part=gizmo.io.Read.read_snapshots(species, snapshot_value_kind, snapshot_number, simulation_directory='.', snapshot_directory='output/', simulation_name='', properties=properties, element_indices=None, particle_subsample_factor=0, separate_dark_lowres=True, sort_dark_by_id=False, convert_float32=True, host_number=1, assign_host_coordinates=True, assign_host_principal_axes=False, assign_host_orbits=False, assign_formation_coordinates=False, assign_pointers=False, check_properties=True)
  File "/usr5/username/simulation/gizmo/gizmo_io.py", line 649, in read_snapshots
    element_indices, convert_float32, header)
  File "/usr5/username/simulation/gizmo/gizmo_io.py", line 1171, in read_particles
    part[spec_name][prop] = np.full(prop_shape, -1, prop_in_dtype)
  File "/usr/local/anaconda3/lib/python3.5/site-packages/numpy/core/numeric.py", line 309, in full
    a = empty(shape, dtype, order)
MemoryError
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...