empty(shape, dtype = "float32", dev = this.device("cpu", 0)) {
	        dtype = this.toDLDataType(dtype);
	        shape = typeof shape == "number" ? [shape] : shape;
	        const stack = this.lib.getOrAllocCallStack();
	        const shapeOffset = stack.allocRawBytes(shape.length * 8 /* I64 */);
	        for (let i = 0; i < shape.length; ++i) {
	            stack.storeI64(shapeOffset + i * 8 /* I64 */, shape[i]);
	        }
	        const outOffset = stack.allocPtrArray(1);
	        const outPtr = stack.ptrFromOffset(outOffset);
	        stack.commitToWasmMemory(outOffset);
	        this.lib.checkCall(this.exports.TVMArrayAlloc(stack.ptrFromOffset(shapeOffset), shape.length, dtype.code, dtype.bits, dtype.lanes, dev.deviceType, dev.deviceId, outPtr));
	        const ret = this.ctx.attachToCurrentScope(new NDArray(this.memory.loadPointer(outPtr), false, this.lib, this.ctx));
	        this.lib.recycleCallStack(stack);
	        return ret;
	    }
Create an empty {@link NDArray} with given shape and dtype.

@param shape The shape of the array.
@param dtype The data type of the array.
@param dev The device of the ndarray.
@returns The created ndarray.