Source code for ansys.dyna.core.lib.array

# Copyright (C) 2021 - 2024 ANSYS, Inc. and/or its affiliates.
# SPDX-License-Identifier: MIT
#
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import array as ar
import math


[docs] def array(element_type: type, reserved_size: int = 0, default_value=None): """A resizable array that supports optional values for any type Right now - array.array is used for single and double precision floating points for everything else - python list is used. This is because no existing array type in numpy, pandas, and python meet the above requirements. Specifically, numpy integer arrays do not have optional values and are not resizable, pandas integer arrays support optional values but are also not resizable, while python array arrays are resizable but do not support optional values. The problem with this approach is memory usage. For 100k integers, a python list appears to take about 5300K, while a pandas array and numpy array take 488K and 584K respectively. pandas arrays take more memory than numpy because of the masking used to support optional integer values. Given a python list of optional integer, where None is used to represent a missing value, - this is how you convert to either type: numpy: np.array([item or 0 for item in the_list], dtype=np.int32) pandas: pd.array(the_list,dtype=pd.Int32Dtype()) In the future - A dynamic array class based on some of the above types can be used for integer arrays. For string arrays, pandas arrays don't offer any value over python lists. """ if element_type == float: arr = ar.array("d") if reserved_size == 0: return arr if default_value == None: default_value = math.nan for i in range(reserved_size): arr.append(default_value) return arr if reserved_size == 0: return list() else: return [default_value] * reserved_size