在Python中创建数组,而不预先填充数据



enter code here有没有一种方法可以在Python中创建(多维)数组,而无需预先用数据填充这些数组?

具体来说,我正在寻找与我在这里找到的Ironpython解决方案等效的东西:

import clr
from System import Array,Boolean,Double
from System.Activator import CreateInstance
a=clr.Reference[Array[str]](Array[str](('')))
b=clr.Reference[Array[float]](Array.CreateInstance(Double,0))

我尝试了ctypes(例如a=(c_double*2*3)()),但这样数组就用零预填充了。知道吗?

问题是我有一个带有API的COM对象,其函数类似于:

ret=函数(var1、var2、var3…)

其中var1、var2、var3是要由值填充的多维数组。如果我使用Ironpython,我可以通过系统模块与COM对象通信,如:

from System.Type import GetTypeFromProgID
from System.Activator import CreateInstance
# Create Sap2000 object
sap = CreateInstance(GetTypeFromProgID("Sap2000.SapObject"))

然后我通过用clr构建var1、var2、var3来解决问题。参考

使用CPython时,我使用win32com.client模块与COM对象通信,但现在我不知道如何构建var1、var2和var3,以便它们在函数中工作。

谢谢,

这是代码:

import win32com.client 
from ctypes import*

def Sap2000():
    sap,SapModel=OpenSap2000(Visible = True)
    NewModel(SapModel)
    #define material property
    ret = SapModel.PropMaterial.SetMaterial("CONC", 2) #MATERIAL_CONCRETE)
    #assign isotropic mechanical properties to material
    ret = SapModel.PropMaterial.SetMPIsotropic("CONC", 3600, 0.2, 0.0000055)
    #create model from template
    ret = SapModel.File.New2DFrame(0, 3, 124, 3, 200) # 0=PortalFrame
    #run analysis
    ret = SapModel.File.Save("C:SapAPIxy.sdb")
    ret = SapModel.Analyze.RunAnalysis
    #clear all case and combo output selections
    ret = SapModel.Results.Setup.DeselectAllCasesAndCombosForOutput
    #set case and combo output selections
    ret = SapModel.Results.Setup.SetCaseSelectedForOutput("DEAD")
    #get point displacements
    # Arrays passed by ref
    #Obj=clr.Reference[Array[str]](Array[str](('')))
    Obj=[[""]]
    #Elm=clr.Reference[Array[str]](Array[str](('')))
    Elm=[[""]]
    #LoadCase=clr.Reference[Array[str]](Array[str](('')))
    LoadCase=[[""]]
    #StepType=clr.Reference[Array[str]](Array[str](('')))
    StepType=[[""]]
    #StepNum=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    StepNum=(c_double*3*2)()
    #U1=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    U1=(c_double*3*2)()
    #U2=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    U2=(c_double*3*2)()
    #U3=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    U3=(c_double*3*2)()
    #R1=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    R1=(c_double*3*2)()
    #R2=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    R2=(c_double*3*2)()
    #R3=clr.Reference[Array[float]](Array.CreateInstance(Double,0))
    R3=(c_double*3*2)()
    ret = SapModel.Results.JointDispl("ALL", GroupElm, NumberResults, Obj, Elm, LoadCase, StepType, StepNum, U1, U2, U3, R1, R2, R3)
    print ret


def OpenSap2000(Units='kN_m_C',Visible = False,FileName=''):
    # Create Sap2000 object
    sap = win32com.client.Dispatch("Sap2000.SapObject")
    # Start application
    ret=sap.ApplicationStart(6,Visible,FileName)
    print ret
    SapModel=sap.SapModel
    return sap,SapModel

def NewModel(SapModel,Units='kN_m_C'):
    # Initialize new model
    #SapModel=sap.SapModel
    u=SetUnits(Units)
    ret = SapModel.InitializeNewModel(u)
    # New blank model
    ret = SapModel.File.NewBlank()
    return

if __name__=="__main__":
    Sap2000()

调用SapModel.Results.JointDispl(..)函数失败。

ApplyTypes中的文件"C:\Python26\Lib\site packages\win32com\client__init__.py",第456行自我oleobj.InvokeTypes(dispid,0,wFlags,retType,argTypes,*args),TypeError:SAFEARRAYS的对象必须是序列或缓冲区对象。

list条目在中有一些值,但您可以使用None

对于一维"阵列"来说,它很简单:

[None] * 3

对于二维数组,您必须更加小心,因为您不希望所有嵌套列表都在同一个列表中,所以您可以执行以下操作:

[[None] * 2 for _ in range(3)]

另一种选择是使用具有元组作为密钥的dict,但这也没有固定的大小。

>>> d = {}
>>> d[(1,1)] = 2
>>> d[(1,1)]
2
>>> d[(1,2)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (1, 2)

array模块提供类型化的数字数组,但这些数组与list类似,因为它们没有固定的大小。但是,这些确实需要填充一个值。

>>> from array import array
>>> a = [array('f',[0] * 2) for _ in range(3)]
>>> a
[array('f', [0.0, 0.0]), array('f', [0.0, 0.0]), array('f', [0.0, 0.0])]
>>> a[1][1] = 3.4
>>> a[1][1] = 'string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a float is required

如果您不介意使用NumPy,可以使用numpy.empty()。NumPy可能是多维数组的最佳实现。

它应该预先填充什么?你的用例是什么?

我认为对于维度数组(x,y)最快的解决方案是:

a = [[None] * x for i in range(y)]

这将为您提供一个多维数组,其中None值表示您尚未设置任何值的位置。

相关内容

  • 没有找到相关文章

最新更新