Я заранее извиняюсь за свое невежество, о чем ничего не знаю. NET и столкнулся с этой одной конкретной проблемой, которая сильно замедляет мой код, и постараюсь объяснить ее.
Я использую пакет clr
для взаимодействия с dll. NET, который позволяет мне взаимодействовать с проприетарным типом файла. Для справки, это MIKE SDK: ссылка
Я использую указанную c dll в пакете SDK для извлечения координат из сетки.
мой код выглядит так (после открытия файла):
dfs.ReadStaticItem(static_items_index['X-coord']).Data
это возвращает:
<System.Double[] at 0x2b9b7aa81c8>
Я могу получить количество координат, выполнив:
dfs.ReadStaticItem(static_items_index['X-coord']).ElementCount #31722
и я могу получить полный набор координат, выполнив команду al oop:
nnodes = dfs.ReadStaticItem(static_items_index['X-coord']).ElementCount
x_coords = np.array([dfs.ReadStaticItem(static_items_index['X-coord']).Data[i] \
for i in range(nnodes)])
. Это дает мне ожидаемый результат:
array([223656.14339717, 223650.86894098, 223653.54388233, ...,
224562.53220159, 224564.77450669, 224563.56442112])
Однако, это ужасно медленно, и Я должен сделать это для точек xy и z (и некоторых других вещей).
Должен быть способ извлечь все значения сразу или без al oop?
для запись, если я делаю (если dfs
- мой файловый объект, а static_items_index
просто содержит числа, соответствующие индексу элемента stati c, который я пытаюсь прочитать):
dir(dfs.ReadStaticItem(static_items_index['X-coord']))
возвращает :
['AxisConversionType',
'AxisConversionUnit',
'Bytes',
'ConversionType',
'ConversionUnit',
'Data',
'DataType',
'ElementCount',
'Equals',
'Finalize',
'GetHashCode',
'GetType',
'ItemNumber',
'MemberwiseClone',
'Name',
'OrientationAlpha',
'OrientationPhi',
'OrientationTheta',
'Overloads',
'Quantity',
'ReferenceCoordinateX',
'ReferenceCoordinateY',
'ReferenceCoordinateZ',
'ReferenceEquals',
'SetAxisUnitConversion',
'SetOrientation',
'SetReferenceCoordinates',
'SetUnitConversion',
'SpatialAxis',
'SpatialAxisUpdated',
'ToString',
'UsedBytes',
'UsedElementCount',
'__call__',
'__class__',
'__delattr__',
'__delitem__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__overloads__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__setitem__',
'__sizeof__',
'__str__',
'__subclasshook__',
'_dfsFile',
'_eumQuantity',
'_itemDataType',
'_itemNumber',
'_itemPointer',
'_name',
'get_AxisConversionType',
'get_AxisConversionUnit',
'get_Bytes',
'get_ConversionType',
'get_ConversionUnit',
'get_Data',
'get_DataType',
'get_ElementCount',
'get_ItemNumber',
'get_Name',
'get_OrientationAlpha',
'get_OrientationPhi',
'get_OrientationTheta',
'get_Quantity',
'get_ReferenceCoordinateX',
'get_ReferenceCoordinateY',
'get_ReferenceCoordinateZ',
'get_SpatialAxis',
'get_UsedBytes',
'get_UsedElementCount',
'set_Name',
'set_Quantity']
И .get_Data()
, и .Data
возвращают то же самое, что упомянуто выше.
Есть ли способ сделать это без AL oop? или как-то ускорить его?
Если у кого-то есть идеи, которые были бы хороши, если кто-то захочет скачать SDK и попробовать его самостоятельно, я могу дать им полный код и образец файла, но для воспроизведения моего текущая ошибка не так проста, как копирование / вставка некоторого кода.