maxframe 1.3.1__cp38-cp38-macosx_10_9_universal2.whl → 2.0.0b1__cp38-cp38-macosx_10_9_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/_utils.cpython-38-darwin.so +0 -0
- maxframe/_utils.pyi +21 -0
- maxframe/_utils.pyx +4 -3
- maxframe/codegen/__init__.py +27 -0
- maxframe/{codegen.py → codegen/core.py} +49 -43
- maxframe/codegen/spe/__init__.py +16 -0
- maxframe/codegen/spe/core.py +307 -0
- maxframe/codegen/spe/dataframe/__init__.py +37 -0
- maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
- maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
- maxframe/codegen/spe/dataframe/datasource.py +181 -0
- maxframe/codegen/spe/dataframe/datastore.py +204 -0
- maxframe/codegen/spe/dataframe/extensions.py +63 -0
- maxframe/codegen/spe/dataframe/fetch.py +26 -0
- maxframe/codegen/spe/dataframe/groupby.py +224 -0
- maxframe/codegen/spe/dataframe/indexing.py +238 -0
- maxframe/codegen/spe/dataframe/merge.py +73 -0
- maxframe/codegen/spe/dataframe/misc.py +286 -0
- maxframe/codegen/spe/dataframe/missing.py +64 -0
- maxframe/codegen/spe/dataframe/reduction.py +160 -0
- maxframe/codegen/spe/dataframe/sort.py +83 -0
- maxframe/codegen/spe/dataframe/statistics.py +46 -0
- maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
- maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
- maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
- maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
- maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
- maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
- maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
- maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
- maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
- maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
- maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
- maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
- maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
- maxframe/codegen/spe/dataframe/tseries.py +46 -0
- maxframe/codegen/spe/dataframe/udf.py +62 -0
- maxframe/codegen/spe/dataframe/value_counts.py +31 -0
- maxframe/codegen/spe/dataframe/window.py +65 -0
- maxframe/codegen/spe/learn/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
- maxframe/codegen/spe/learn/contrib/models.py +41 -0
- maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
- maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
- maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
- maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
- maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
- maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
- maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
- maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
- maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
- maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
- maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
- maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
- maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
- maxframe/codegen/spe/learn/utils/__init__.py +15 -0
- maxframe/codegen/spe/learn/utils/checks.py +55 -0
- maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
- maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
- maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
- maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
- maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
- maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
- maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
- maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
- maxframe/codegen/spe/learn/utils/validation.py +35 -0
- maxframe/codegen/spe/objects.py +26 -0
- maxframe/codegen/spe/remote.py +29 -0
- maxframe/codegen/spe/tensor/__init__.py +28 -0
- maxframe/codegen/spe/tensor/arithmetic.py +95 -0
- maxframe/codegen/spe/tensor/core.py +41 -0
- maxframe/codegen/spe/tensor/datasource.py +165 -0
- maxframe/codegen/spe/tensor/extensions.py +35 -0
- maxframe/codegen/spe/tensor/fetch.py +26 -0
- maxframe/codegen/spe/tensor/indexing.py +63 -0
- maxframe/codegen/spe/tensor/linalg.py +63 -0
- maxframe/codegen/spe/tensor/merge.py +31 -0
- maxframe/codegen/spe/tensor/misc.py +121 -0
- maxframe/codegen/spe/tensor/random.py +29 -0
- maxframe/codegen/spe/tensor/reduction.py +39 -0
- maxframe/codegen/spe/tensor/reshape.py +26 -0
- maxframe/codegen/spe/tensor/sort.py +42 -0
- maxframe/codegen/spe/tensor/special.py +35 -0
- maxframe/codegen/spe/tensor/statistics.py +24 -0
- maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
- maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
- maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
- maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
- maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
- maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
- maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
- maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
- maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
- maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
- maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
- maxframe/codegen/spe/tests/__init__.py +13 -0
- maxframe/codegen/spe/tests/test_remote.py +29 -0
- maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
- maxframe/codegen/spe/utils.py +54 -0
- maxframe/codegen/tests/__init__.py +13 -0
- maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +50 -23
- maxframe/config/tests/test_config.py +4 -12
- maxframe/config/validators.py +5 -0
- maxframe/conftest.py +38 -10
- maxframe/core/__init__.py +1 -0
- maxframe/core/context.py +110 -0
- maxframe/core/entity/__init__.py +1 -0
- maxframe/core/entity/core.py +0 -7
- maxframe/core/entity/objects.py +19 -5
- maxframe/core/entity/output_types.py +11 -0
- maxframe/core/entity/tests/test_objects.py +11 -12
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/entity/utils.py +15 -0
- maxframe/core/graph/__init__.py +6 -1
- maxframe/core/graph/builder/base.py +5 -1
- maxframe/core/graph/core.cpython-38-darwin.so +0 -0
- maxframe/core/graph/core.pyx +17 -6
- maxframe/core/graph/entity.py +18 -6
- maxframe/core/operator/__init__.py +8 -3
- maxframe/core/operator/base.py +35 -12
- maxframe/core/operator/core.py +37 -14
- maxframe/core/operator/fetch.py +5 -18
- maxframe/core/operator/objects.py +0 -20
- maxframe/core/operator/shuffle.py +6 -72
- maxframe/dataframe/__init__.py +1 -0
- maxframe/dataframe/accessors/datetime_/core.py +7 -4
- maxframe/dataframe/accessors/string_/core.py +9 -6
- maxframe/dataframe/arithmetic/core.py +31 -20
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/dataframe/core.py +98 -91
- maxframe/dataframe/datasource/core.py +8 -1
- maxframe/dataframe/datasource/date_range.py +8 -0
- maxframe/dataframe/datasource/from_index.py +9 -5
- maxframe/dataframe/datasource/from_records.py +9 -2
- maxframe/dataframe/datasource/from_tensor.py +32 -21
- maxframe/dataframe/datasource/read_csv.py +8 -2
- maxframe/dataframe/datasource/read_odps_query.py +33 -3
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +33 -0
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +9 -8
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +65 -3
- maxframe/dataframe/reduction/core.py +3 -1
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +8 -55
- maxframe/io/odpsio/arrow.py +15 -2
- maxframe/io/odpsio/schema.py +43 -13
- maxframe/io/odpsio/tableio.py +63 -11
- maxframe/io/odpsio/tests/test_arrow.py +1 -2
- maxframe/io/odpsio/tests/test_schema.py +114 -1
- maxframe/io/odpsio/tests/test_tableio.py +42 -0
- maxframe/io/odpsio/tests/test_volumeio.py +22 -48
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +53 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +16 -9
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cpython-38-darwin.so +0 -0
- maxframe/lib/sparse/__init__.py +10 -15
- maxframe/lib/sparse/array.py +45 -33
- maxframe/lib/sparse/core.py +0 -2
- maxframe/lib/sparse/linalg.py +31 -0
- maxframe/lib/sparse/matrix.py +5 -2
- maxframe/lib/sparse/tests/__init__.py +0 -2
- maxframe/lib/sparse/tests/test_sparse.py +53 -53
- maxframe/lib/sparse/vector.py +0 -2
- maxframe/mixin.py +59 -2
- maxframe/opcodes.py +13 -5
- maxframe/protocol.py +67 -14
- maxframe/remote/core.py +16 -14
- maxframe/remote/run_script.py +6 -3
- maxframe/serialization/__init__.py +2 -0
- maxframe/serialization/core.cpython-38-darwin.so +0 -0
- maxframe/serialization/core.pxd +3 -0
- maxframe/serialization/core.pyi +3 -1
- maxframe/serialization/core.pyx +82 -4
- maxframe/serialization/pandas.py +5 -1
- maxframe/serialization/serializables/core.py +6 -5
- maxframe/serialization/serializables/field.py +2 -2
- maxframe/serialization/serializables/tests/test_field_type.py +3 -5
- maxframe/serialization/tests/test_serial.py +27 -0
- maxframe/session.py +4 -71
- maxframe/sperunner.py +165 -0
- maxframe/tensor/__init__.py +35 -2
- maxframe/tensor/arithmetic/__init__.py +2 -4
- maxframe/tensor/arithmetic/abs.py +0 -2
- maxframe/tensor/arithmetic/absolute.py +0 -2
- maxframe/tensor/arithmetic/add.py +34 -4
- maxframe/tensor/arithmetic/angle.py +0 -2
- maxframe/tensor/arithmetic/arccos.py +1 -4
- maxframe/tensor/arithmetic/arccosh.py +1 -3
- maxframe/tensor/arithmetic/arcsin.py +0 -2
- maxframe/tensor/arithmetic/arcsinh.py +0 -2
- maxframe/tensor/arithmetic/arctan.py +0 -2
- maxframe/tensor/arithmetic/arctan2.py +0 -2
- maxframe/tensor/arithmetic/arctanh.py +0 -2
- maxframe/tensor/arithmetic/around.py +0 -2
- maxframe/tensor/arithmetic/bitand.py +0 -2
- maxframe/tensor/arithmetic/bitor.py +1 -3
- maxframe/tensor/arithmetic/bitxor.py +1 -3
- maxframe/tensor/arithmetic/cbrt.py +0 -2
- maxframe/tensor/arithmetic/ceil.py +0 -2
- maxframe/tensor/arithmetic/clip.py +13 -13
- maxframe/tensor/arithmetic/conj.py +0 -2
- maxframe/tensor/arithmetic/copysign.py +0 -2
- maxframe/tensor/arithmetic/core.py +47 -39
- maxframe/tensor/arithmetic/cos.py +1 -3
- maxframe/tensor/arithmetic/cosh.py +0 -2
- maxframe/tensor/arithmetic/deg2rad.py +0 -2
- maxframe/tensor/arithmetic/degrees.py +0 -2
- maxframe/tensor/arithmetic/divide.py +0 -2
- maxframe/tensor/arithmetic/equal.py +0 -2
- maxframe/tensor/arithmetic/exp.py +1 -3
- maxframe/tensor/arithmetic/exp2.py +0 -2
- maxframe/tensor/arithmetic/expm1.py +0 -2
- maxframe/tensor/arithmetic/fabs.py +0 -2
- maxframe/tensor/arithmetic/fix.py +0 -2
- maxframe/tensor/arithmetic/float_power.py +0 -2
- maxframe/tensor/arithmetic/floor.py +0 -2
- maxframe/tensor/arithmetic/floordiv.py +0 -2
- maxframe/tensor/arithmetic/fmax.py +0 -2
- maxframe/tensor/arithmetic/fmin.py +0 -2
- maxframe/tensor/arithmetic/fmod.py +0 -2
- maxframe/tensor/arithmetic/frexp.py +6 -2
- maxframe/tensor/arithmetic/greater.py +0 -2
- maxframe/tensor/arithmetic/greater_equal.py +0 -2
- maxframe/tensor/arithmetic/hypot.py +0 -2
- maxframe/tensor/arithmetic/i0.py +1 -3
- maxframe/tensor/arithmetic/imag.py +0 -2
- maxframe/tensor/arithmetic/invert.py +1 -3
- maxframe/tensor/arithmetic/isclose.py +0 -2
- maxframe/tensor/arithmetic/iscomplex.py +0 -2
- maxframe/tensor/arithmetic/isfinite.py +1 -3
- maxframe/tensor/arithmetic/isinf.py +0 -2
- maxframe/tensor/arithmetic/isnan.py +0 -2
- maxframe/tensor/arithmetic/isreal.py +0 -2
- maxframe/tensor/arithmetic/ldexp.py +0 -2
- maxframe/tensor/arithmetic/less.py +0 -2
- maxframe/tensor/arithmetic/less_equal.py +0 -2
- maxframe/tensor/arithmetic/log.py +1 -3
- maxframe/tensor/arithmetic/log10.py +1 -3
- maxframe/tensor/arithmetic/log1p.py +1 -3
- maxframe/tensor/arithmetic/log2.py +1 -3
- maxframe/tensor/arithmetic/logaddexp.py +0 -2
- maxframe/tensor/arithmetic/logaddexp2.py +0 -2
- maxframe/tensor/arithmetic/logical_and.py +0 -2
- maxframe/tensor/arithmetic/logical_not.py +1 -3
- maxframe/tensor/arithmetic/logical_or.py +0 -2
- maxframe/tensor/arithmetic/logical_xor.py +0 -2
- maxframe/tensor/arithmetic/lshift.py +0 -2
- maxframe/tensor/arithmetic/maximum.py +0 -2
- maxframe/tensor/arithmetic/minimum.py +0 -2
- maxframe/tensor/arithmetic/mod.py +0 -2
- maxframe/tensor/arithmetic/modf.py +6 -2
- maxframe/tensor/arithmetic/multiply.py +37 -4
- maxframe/tensor/arithmetic/nan_to_num.py +0 -2
- maxframe/tensor/arithmetic/negative.py +0 -2
- maxframe/tensor/arithmetic/nextafter.py +0 -2
- maxframe/tensor/arithmetic/not_equal.py +0 -2
- maxframe/tensor/arithmetic/positive.py +0 -2
- maxframe/tensor/arithmetic/power.py +0 -2
- maxframe/tensor/arithmetic/rad2deg.py +0 -2
- maxframe/tensor/arithmetic/radians.py +0 -2
- maxframe/tensor/arithmetic/real.py +0 -2
- maxframe/tensor/arithmetic/reciprocal.py +5 -3
- maxframe/tensor/arithmetic/rint.py +1 -3
- maxframe/tensor/arithmetic/rshift.py +0 -2
- maxframe/tensor/arithmetic/setimag.py +0 -2
- maxframe/tensor/arithmetic/setreal.py +0 -2
- maxframe/tensor/arithmetic/sign.py +0 -2
- maxframe/tensor/arithmetic/signbit.py +0 -2
- maxframe/tensor/arithmetic/sin.py +0 -2
- maxframe/tensor/arithmetic/sinc.py +1 -3
- maxframe/tensor/arithmetic/sinh.py +0 -2
- maxframe/tensor/arithmetic/spacing.py +0 -2
- maxframe/tensor/arithmetic/sqrt.py +0 -2
- maxframe/tensor/arithmetic/square.py +0 -2
- maxframe/tensor/arithmetic/subtract.py +4 -2
- maxframe/tensor/arithmetic/tan.py +0 -2
- maxframe/tensor/arithmetic/tanh.py +0 -2
- maxframe/tensor/arithmetic/tests/__init__.py +0 -2
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
- maxframe/tensor/arithmetic/truediv.py +0 -2
- maxframe/tensor/arithmetic/trunc.py +0 -2
- maxframe/tensor/arithmetic/utils.py +32 -6
- maxframe/tensor/array_utils.py +3 -25
- maxframe/tensor/core.py +6 -6
- maxframe/tensor/datasource/__init__.py +10 -2
- maxframe/tensor/datasource/arange.py +0 -2
- maxframe/tensor/datasource/array.py +3 -22
- maxframe/tensor/datasource/core.py +15 -10
- maxframe/tensor/datasource/diag.py +140 -0
- maxframe/tensor/datasource/diagflat.py +69 -0
- maxframe/tensor/datasource/empty.py +0 -2
- maxframe/tensor/datasource/eye.py +95 -0
- maxframe/tensor/datasource/from_dataframe.py +0 -2
- maxframe/tensor/datasource/from_dense.py +0 -17
- maxframe/tensor/datasource/from_sparse.py +0 -2
- maxframe/tensor/datasource/full.py +0 -2
- maxframe/tensor/datasource/identity.py +54 -0
- maxframe/tensor/datasource/indices.py +115 -0
- maxframe/tensor/datasource/linspace.py +140 -0
- maxframe/tensor/datasource/meshgrid.py +135 -0
- maxframe/tensor/datasource/ones.py +8 -3
- maxframe/tensor/datasource/tests/test_datasource.py +32 -1
- maxframe/tensor/datasource/tri_array.py +107 -0
- maxframe/tensor/datasource/zeros.py +7 -3
- maxframe/tensor/extensions/__init__.py +31 -0
- maxframe/tensor/extensions/accessor.py +25 -0
- maxframe/tensor/extensions/apply_chunk.py +137 -0
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +8 -6
- maxframe/tensor/indexing/compress.py +0 -2
- maxframe/tensor/indexing/extract.py +0 -2
- maxframe/tensor/indexing/fill_diagonal.py +9 -6
- maxframe/tensor/indexing/flatnonzero.py +1 -3
- maxframe/tensor/indexing/getitem.py +10 -43
- maxframe/tensor/indexing/nonzero.py +2 -4
- maxframe/tensor/indexing/setitem.py +19 -9
- maxframe/tensor/indexing/slice.py +6 -3
- maxframe/tensor/indexing/take.py +0 -2
- maxframe/tensor/indexing/tests/__init__.py +0 -2
- maxframe/tensor/indexing/tests/test_indexing.py +0 -2
- maxframe/tensor/indexing/unravel_index.py +6 -6
- maxframe/tensor/lib/__init__.py +16 -0
- maxframe/tensor/lib/index_tricks.py +404 -0
- maxframe/tensor/linalg/__init__.py +36 -0
- maxframe/tensor/linalg/dot.py +145 -0
- maxframe/tensor/linalg/inner.py +36 -0
- maxframe/tensor/linalg/inv.py +83 -0
- maxframe/tensor/linalg/lu.py +115 -0
- maxframe/tensor/linalg/matmul.py +225 -0
- maxframe/tensor/linalg/qr.py +124 -0
- maxframe/tensor/linalg/solve_triangular.py +103 -0
- maxframe/tensor/linalg/svd.py +167 -0
- maxframe/tensor/linalg/tensordot.py +213 -0
- maxframe/tensor/linalg/vdot.py +73 -0
- maxframe/tensor/merge/__init__.py +4 -0
- maxframe/tensor/merge/append.py +74 -0
- maxframe/tensor/merge/column_stack.py +63 -0
- maxframe/tensor/merge/concatenate.py +3 -2
- maxframe/tensor/merge/dstack.py +71 -0
- maxframe/tensor/merge/hstack.py +70 -0
- maxframe/tensor/merge/stack.py +0 -2
- maxframe/tensor/merge/tests/test_merge.py +0 -2
- maxframe/tensor/misc/__init__.py +18 -5
- maxframe/tensor/misc/astype.py +10 -8
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/copy.py +64 -0
- maxframe/tensor/misc/diff.py +115 -0
- maxframe/tensor/misc/flatten.py +63 -0
- maxframe/tensor/misc/in1d.py +94 -0
- maxframe/tensor/misc/isin.py +130 -0
- maxframe/tensor/misc/ndim.py +53 -0
- maxframe/tensor/misc/ravel.py +0 -2
- maxframe/tensor/misc/repeat.py +129 -0
- maxframe/tensor/misc/searchsorted.py +147 -0
- maxframe/tensor/misc/setdiff1d.py +58 -0
- maxframe/tensor/misc/squeeze.py +117 -0
- maxframe/tensor/misc/swapaxes.py +113 -0
- maxframe/tensor/misc/tests/test_misc.py +0 -2
- maxframe/tensor/misc/transpose.py +8 -4
- maxframe/tensor/misc/trapezoid.py +123 -0
- maxframe/tensor/misc/unique.py +0 -1
- maxframe/tensor/misc/where.py +10 -8
- maxframe/tensor/operators.py +0 -34
- maxframe/tensor/random/__init__.py +3 -5
- maxframe/tensor/random/binomial.py +0 -2
- maxframe/tensor/random/bytes.py +0 -2
- maxframe/tensor/random/chisquare.py +0 -2
- maxframe/tensor/random/choice.py +9 -8
- maxframe/tensor/random/core.py +20 -5
- maxframe/tensor/random/dirichlet.py +0 -2
- maxframe/tensor/random/exponential.py +0 -2
- maxframe/tensor/random/f.py +2 -4
- maxframe/tensor/random/gamma.py +0 -2
- maxframe/tensor/random/geometric.py +0 -2
- maxframe/tensor/random/gumbel.py +0 -2
- maxframe/tensor/random/hypergeometric.py +0 -2
- maxframe/tensor/random/laplace.py +2 -4
- maxframe/tensor/random/logistic.py +0 -2
- maxframe/tensor/random/lognormal.py +0 -2
- maxframe/tensor/random/logseries.py +0 -2
- maxframe/tensor/random/multinomial.py +0 -2
- maxframe/tensor/random/multivariate_normal.py +0 -2
- maxframe/tensor/random/negative_binomial.py +0 -2
- maxframe/tensor/random/noncentral_chisquare.py +0 -2
- maxframe/tensor/random/noncentral_f.py +1 -3
- maxframe/tensor/random/normal.py +0 -2
- maxframe/tensor/random/pareto.py +0 -2
- maxframe/tensor/random/permutation.py +6 -3
- maxframe/tensor/random/poisson.py +0 -2
- maxframe/tensor/random/power.py +0 -2
- maxframe/tensor/random/rand.py +0 -2
- maxframe/tensor/random/randint.py +0 -2
- maxframe/tensor/random/randn.py +0 -2
- maxframe/tensor/random/random_integers.py +0 -2
- maxframe/tensor/random/random_sample.py +0 -2
- maxframe/tensor/random/rayleigh.py +0 -2
- maxframe/tensor/random/standard_cauchy.py +0 -2
- maxframe/tensor/random/standard_exponential.py +0 -2
- maxframe/tensor/random/standard_gamma.py +0 -2
- maxframe/tensor/random/standard_normal.py +0 -2
- maxframe/tensor/random/standard_t.py +0 -2
- maxframe/tensor/random/tests/__init__.py +0 -2
- maxframe/tensor/random/tests/test_random.py +0 -2
- maxframe/tensor/random/triangular.py +0 -2
- maxframe/tensor/random/uniform.py +0 -2
- maxframe/tensor/random/vonmises.py +0 -2
- maxframe/tensor/random/wald.py +0 -2
- maxframe/tensor/random/weibull.py +0 -2
- maxframe/tensor/random/zipf.py +0 -2
- maxframe/tensor/reduction/__init__.py +0 -2
- maxframe/tensor/reduction/all.py +0 -2
- maxframe/tensor/reduction/allclose.py +0 -2
- maxframe/tensor/reduction/any.py +0 -2
- maxframe/tensor/reduction/argmax.py +1 -3
- maxframe/tensor/reduction/argmin.py +1 -3
- maxframe/tensor/reduction/array_equal.py +0 -2
- maxframe/tensor/reduction/core.py +0 -2
- maxframe/tensor/reduction/count_nonzero.py +0 -2
- maxframe/tensor/reduction/cumprod.py +0 -2
- maxframe/tensor/reduction/cumsum.py +0 -2
- maxframe/tensor/reduction/max.py +0 -2
- maxframe/tensor/reduction/mean.py +0 -2
- maxframe/tensor/reduction/min.py +0 -2
- maxframe/tensor/reduction/nanargmax.py +0 -2
- maxframe/tensor/reduction/nanargmin.py +0 -2
- maxframe/tensor/reduction/nancumprod.py +0 -2
- maxframe/tensor/reduction/nancumsum.py +0 -2
- maxframe/tensor/reduction/nanmax.py +0 -2
- maxframe/tensor/reduction/nanmean.py +0 -2
- maxframe/tensor/reduction/nanmin.py +0 -2
- maxframe/tensor/reduction/nanprod.py +0 -2
- maxframe/tensor/reduction/nanstd.py +0 -2
- maxframe/tensor/reduction/nansum.py +0 -2
- maxframe/tensor/reduction/nanvar.py +0 -2
- maxframe/tensor/reduction/prod.py +0 -2
- maxframe/tensor/reduction/std.py +0 -2
- maxframe/tensor/reduction/sum.py +0 -2
- maxframe/tensor/reduction/tests/test_reduction.py +1 -4
- maxframe/tensor/reduction/var.py +0 -2
- maxframe/tensor/reshape/__init__.py +0 -2
- maxframe/tensor/reshape/reshape.py +6 -5
- maxframe/tensor/reshape/tests/__init__.py +0 -2
- maxframe/tensor/reshape/tests/test_reshape.py +0 -2
- maxframe/tensor/sort/__init__.py +16 -0
- maxframe/tensor/sort/argsort.py +150 -0
- maxframe/tensor/sort/sort.py +295 -0
- maxframe/tensor/special/__init__.py +37 -0
- maxframe/tensor/special/core.py +38 -0
- maxframe/tensor/special/misc.py +142 -0
- maxframe/tensor/special/statistical.py +56 -0
- maxframe/tensor/statistics/__init__.py +5 -0
- maxframe/tensor/statistics/average.py +143 -0
- maxframe/tensor/statistics/bincount.py +133 -0
- maxframe/tensor/statistics/quantile.py +10 -8
- maxframe/tensor/ufunc/__init__.py +0 -2
- maxframe/tensor/ufunc/ufunc.py +0 -2
- maxframe/tensor/utils.py +21 -3
- maxframe/tests/test_protocol.py +3 -3
- maxframe/tests/test_utils.py +210 -1
- maxframe/tests/utils.py +67 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +4 -1
- maxframe-2.0.0b1.dist-info/RECORD +939 -0
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +0 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
from numpy.linalg import LinAlgError
|
|
17
|
+
|
|
18
|
+
from ... import opcodes
|
|
19
|
+
from ...core import ExecutableTuple
|
|
20
|
+
from ...serialization.serializables import StringField
|
|
21
|
+
from ..core import TensorOrder
|
|
22
|
+
from ..datasource import tensor as astensor
|
|
23
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TensorSVD(TensorHasInput, TensorOperatorMixin):
|
|
27
|
+
_op_type_ = opcodes.SVD
|
|
28
|
+
|
|
29
|
+
method = StringField("method")
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def output_limit(self):
|
|
33
|
+
return 3
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def _is_svd(cls):
|
|
37
|
+
return True
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def _calc_svd_shapes(a):
|
|
41
|
+
"""
|
|
42
|
+
Calculate output shapes of singular value decomposition.
|
|
43
|
+
Follow the behavior of `numpy`:
|
|
44
|
+
if a's shape is (6, 18), U's shape is (6, 6), s's shape is (6,), V's shape is (6, 18)
|
|
45
|
+
if a's shape is (18, 6), U's shape is (18, 6), s's shape is (6,), V's shape is (6, 6)
|
|
46
|
+
:param a: input tensor
|
|
47
|
+
:return: (U.shape, s.shape, V.shape)
|
|
48
|
+
"""
|
|
49
|
+
x, y = a.shape
|
|
50
|
+
if x > y:
|
|
51
|
+
return (x, y), (y,), (y, y)
|
|
52
|
+
else:
|
|
53
|
+
return (x, x), (x,), (x, y)
|
|
54
|
+
|
|
55
|
+
def __call__(self, a):
|
|
56
|
+
a = astensor(a)
|
|
57
|
+
|
|
58
|
+
if a.ndim != 2:
|
|
59
|
+
raise LinAlgError(
|
|
60
|
+
f"{a.ndim}-dimensional tensor given. Tensor must be two-dimensional"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
tiny_U, tiny_s, tiny_V = np.linalg.svd(np.ones((1, 1), dtype=a.dtype))
|
|
64
|
+
|
|
65
|
+
# if a's shape is (6, 18), U's shape is (6, 6), s's shape is (6,), V's shape is (6, 18)
|
|
66
|
+
# if a's shape is (18, 6), U's shape is (18, 6), s's shape is (6,), V's shape is (6, 6)
|
|
67
|
+
U_shape, s_shape, V_shape = self._calc_svd_shapes(a)
|
|
68
|
+
U, s, V = self.new_tensors(
|
|
69
|
+
[a],
|
|
70
|
+
order=TensorOrder.C_ORDER,
|
|
71
|
+
kws=[
|
|
72
|
+
{"side": "U", "dtype": tiny_U.dtype, "shape": U_shape},
|
|
73
|
+
{"side": "s", "dtype": tiny_s.dtype, "shape": s_shape},
|
|
74
|
+
{"side": "V", "dtype": tiny_V.dtype, "shape": V_shape},
|
|
75
|
+
],
|
|
76
|
+
)
|
|
77
|
+
return ExecutableTuple([U, s, V])
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def svd(a, method="tsqr"):
|
|
81
|
+
"""
|
|
82
|
+
Singular Value Decomposition.
|
|
83
|
+
|
|
84
|
+
When `a` is a 2D tensor, it is factorized as ``u @ np.diag(s) @ vh
|
|
85
|
+
= (u * s) @ vh``, where `u` and `vh` are 2D unitary tensors and `s` is a 1D
|
|
86
|
+
tensor of `a`'s singular values. When `a` is higher-dimensional, SVD is
|
|
87
|
+
applied in stacked mode as explained below.
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
a : (..., M, N) array_like
|
|
92
|
+
A real or complex tensor with ``a.ndim >= 2``.
|
|
93
|
+
method: {'tsqr'}, optional
|
|
94
|
+
method to calculate qr factorization, tsqr as default
|
|
95
|
+
|
|
96
|
+
TSQR is presented in:
|
|
97
|
+
|
|
98
|
+
A. Benson, D. Gleich, and J. Demmel.
|
|
99
|
+
Direct QR factorizations for tall-and-skinny matrices in
|
|
100
|
+
MapReduce architectures.
|
|
101
|
+
IEEE International Conference on Big Data, 2013.
|
|
102
|
+
http://arxiv.org/abs/1301.1071
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
Returns
|
|
106
|
+
-------
|
|
107
|
+
u : { (..., M, M), (..., M, K) } tensor
|
|
108
|
+
Unitary tensor(s). The first ``a.ndim - 2`` dimensions have the same
|
|
109
|
+
size as those of the input `a`. The size of the last two dimensions
|
|
110
|
+
depends on the value of `full_matrices`. Only returned when
|
|
111
|
+
`compute_uv` is True.
|
|
112
|
+
s : (..., K) tensor
|
|
113
|
+
Vector(s) with the singular values, within each vector sorted in
|
|
114
|
+
descending order. The first ``a.ndim - 2`` dimensions have the same
|
|
115
|
+
size as those of the input `a`.
|
|
116
|
+
vh : { (..., N, N), (..., K, N) } tensor
|
|
117
|
+
Unitary tensor(s). The first ``a.ndim - 2`` dimensions have the same
|
|
118
|
+
size as those of the input `a`. The size of the last two dimensions
|
|
119
|
+
depends on the value of `full_matrices`. Only returned when
|
|
120
|
+
`compute_uv` is True.
|
|
121
|
+
|
|
122
|
+
Raises
|
|
123
|
+
------
|
|
124
|
+
LinAlgError
|
|
125
|
+
If SVD computation does not converge.
|
|
126
|
+
|
|
127
|
+
Notes
|
|
128
|
+
-----
|
|
129
|
+
|
|
130
|
+
SVD is usually described for the factorization of a 2D matrix :math:`A`.
|
|
131
|
+
The higher-dimensional case will be discussed below. In the 2D case, SVD is
|
|
132
|
+
written as :math:`A = U S V^H`, where :math:`A = a`, :math:`U= u`,
|
|
133
|
+
:math:`S= \\mathtt{np.diag}(s)` and :math:`V^H = vh`. The 1D tensor `s`
|
|
134
|
+
contains the singular values of `a` and `u` and `vh` are unitary. The rows
|
|
135
|
+
of `vh` are the eigenvectors of :math:`A^H A` and the columns of `u` are
|
|
136
|
+
the eigenvectors of :math:`A A^H`. In both cases the corresponding
|
|
137
|
+
(possibly non-zero) eigenvalues are given by ``s**2``.
|
|
138
|
+
|
|
139
|
+
If `a` has more than two dimensions, then broadcasting rules apply, as
|
|
140
|
+
explained in :ref:`routines.linalg-broadcasting`. This means that SVD is
|
|
141
|
+
working in "stacked" mode: it iterates over all indices of the first
|
|
142
|
+
``a.ndim - 2`` dimensions and for each combination SVD is applied to the
|
|
143
|
+
last two indices. The matrix `a` can be reconstructed from the
|
|
144
|
+
decomposition with either ``(u * s[..., None, :]) @ vh`` or
|
|
145
|
+
``u @ (s[..., None] * vh)``. (The ``@`` operator can be replaced by the
|
|
146
|
+
function ``mt.matmul`` for python versions below 3.5.)
|
|
147
|
+
|
|
148
|
+
Examples
|
|
149
|
+
--------
|
|
150
|
+
>>> import maxframe.tensor as mt
|
|
151
|
+
>>> a = mt.random.randn(9, 6) + 1j*mt.random.randn(9, 6)
|
|
152
|
+
>>> b = mt.random.randn(2, 7, 8, 3) + 1j*mt.random.randn(2, 7, 8, 3)
|
|
153
|
+
|
|
154
|
+
Reconstruction based on reduced SVD, 2D case:
|
|
155
|
+
|
|
156
|
+
>>> u, s, vh = mt.linalg.svd(a)
|
|
157
|
+
>>> u.shape, s.shape, vh.shape
|
|
158
|
+
((9, 6), (6,), (6, 6))
|
|
159
|
+
>>> np.allclose(a, np.dot(u * s, vh))
|
|
160
|
+
True
|
|
161
|
+
>>> smat = np.diag(s)
|
|
162
|
+
>>> np.allclose(a, np.dot(u, np.dot(smat, vh)))
|
|
163
|
+
True
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
op = TensorSVD(method=method)
|
|
167
|
+
return op(a)
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from collections.abc import Iterable
|
|
16
|
+
from typing import List
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
from ... import opcodes
|
|
21
|
+
from ...core import EntityData
|
|
22
|
+
from ...serialization.serializables import FieldTypes, KeyField, TupleField
|
|
23
|
+
from ..core import TensorOrder
|
|
24
|
+
from ..datasource import tensor as astensor
|
|
25
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TensorTensorDot(TensorOperator, TensorOperatorMixin):
|
|
29
|
+
_op_type_ = opcodes.TENSORDOT
|
|
30
|
+
|
|
31
|
+
a = KeyField("a")
|
|
32
|
+
b = KeyField("b")
|
|
33
|
+
a_axes = TupleField("a_axes", FieldTypes.int32)
|
|
34
|
+
b_axes = TupleField("b_axes", FieldTypes.int32)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def _set_inputs(cls, op: "TensorTensorDot", inputs: List[EntityData]):
|
|
38
|
+
super()._set_inputs(op, inputs)
|
|
39
|
+
op.a = op._inputs[0]
|
|
40
|
+
op.b = op._inputs[1]
|
|
41
|
+
|
|
42
|
+
def __call__(self, a, b):
|
|
43
|
+
shape = tuple(
|
|
44
|
+
s for i, s in enumerate(a.shape) if i not in set(self.a_axes)
|
|
45
|
+
) + tuple(s for i, s in enumerate(b.shape) if i not in set(self.b_axes))
|
|
46
|
+
return self.new_tensor([a, b], shape, order=TensorOrder.C_ORDER)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def tensordot(a, b, axes=2, sparse=None):
|
|
50
|
+
"""
|
|
51
|
+
Compute tensor dot product along specified axes for tensors >= 1-D.
|
|
52
|
+
|
|
53
|
+
Given two tensors (arrays of dimension greater than or equal to one),
|
|
54
|
+
`a` and `b`, and an array_like object containing two array_like
|
|
55
|
+
objects, ``(a_axes, b_axes)``, sum the products of `a`'s and `b`'s
|
|
56
|
+
elements (components) over the axes specified by ``a_axes`` and
|
|
57
|
+
``b_axes``. The third argument can be a single non-negative
|
|
58
|
+
integer_like scalar, ``N``; if it is such, then the last ``N``
|
|
59
|
+
dimensions of `a` and the first ``N`` dimensions of `b` are summed
|
|
60
|
+
over.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
a, b : array_like, len(shape) >= 1
|
|
65
|
+
Tensors to "dot".
|
|
66
|
+
axes : int or (2,) array_like
|
|
67
|
+
* integer_like
|
|
68
|
+
If an int N, sum over the last N axes of `a` and the first N axes
|
|
69
|
+
of `b` in order. The sizes of the corresponding axes must match.
|
|
70
|
+
* (2,) array_like
|
|
71
|
+
Or, a list of axes to be summed over, first sequence applying to `a`,
|
|
72
|
+
second to `b`. Both elements array_like must be of the same length.
|
|
73
|
+
|
|
74
|
+
See Also
|
|
75
|
+
--------
|
|
76
|
+
dot, einsum
|
|
77
|
+
|
|
78
|
+
Notes
|
|
79
|
+
-----
|
|
80
|
+
Three common use cases are:
|
|
81
|
+
|
|
82
|
+
* ``axes = 0`` : tensor product :math:`a\\otimes b`
|
|
83
|
+
* ``axes = 1`` : tensor dot product :math:`a\\cdot b`
|
|
84
|
+
* ``axes = 2`` : (default) tensor double contraction :math:`a:b`
|
|
85
|
+
|
|
86
|
+
When `axes` is integer_like, the sequence for evaluation will be: first
|
|
87
|
+
the -Nth axis in `a` and 0th axis in `b`, and the -1th axis in `a` and
|
|
88
|
+
Nth axis in `b` last.
|
|
89
|
+
|
|
90
|
+
When there is more than one axis to sum over - and they are not the last
|
|
91
|
+
(first) axes of `a` (`b`) - the argument `axes` should consist of
|
|
92
|
+
two sequences of the same length, with the first axis to sum over given
|
|
93
|
+
first in both sequences, the second axis second, and so forth.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import maxframe.tensor as mt
|
|
98
|
+
|
|
99
|
+
A "traditional" example:
|
|
100
|
+
|
|
101
|
+
>>> a = mt.arange(60.).reshape(3,4,5)
|
|
102
|
+
>>> b = mt.arange(24.).reshape(4,3,2)
|
|
103
|
+
>>> c = mt.tensordot(a,b, axes=([1,0],[0,1]))
|
|
104
|
+
>>> c.shape
|
|
105
|
+
(5, 2)
|
|
106
|
+
|
|
107
|
+
>>> r = c.execute()
|
|
108
|
+
>>> r
|
|
109
|
+
array([[ 4400., 4730.],
|
|
110
|
+
[ 4532., 4874.],
|
|
111
|
+
[ 4664., 5018.],
|
|
112
|
+
[ 4796., 5162.],
|
|
113
|
+
[ 4928., 5306.]])
|
|
114
|
+
|
|
115
|
+
>>> # A slower but equivalent way of computing the same...
|
|
116
|
+
>>> ra = np.arange(60.).reshape(3,4,5)
|
|
117
|
+
>>> rb = np.arange(24.).reshape(4,3,2)
|
|
118
|
+
>>> d = np.zeros((5,2))
|
|
119
|
+
>>> for i in range(5):
|
|
120
|
+
... for j in range(2):
|
|
121
|
+
... for k in range(3):
|
|
122
|
+
... for n in range(4):
|
|
123
|
+
... d[i,j] += ra[k,n,i] * rb[n,k,j]
|
|
124
|
+
>>> r == d
|
|
125
|
+
array([[ True, True],
|
|
126
|
+
[ True, True],
|
|
127
|
+
[ True, True],
|
|
128
|
+
[ True, True],
|
|
129
|
+
[ True, True]], dtype=bool)
|
|
130
|
+
|
|
131
|
+
An extended example taking advantage of the overloading of + and \\*:
|
|
132
|
+
|
|
133
|
+
>>> a = mt.array(range(1, 9))
|
|
134
|
+
>>> a.shape = (2, 2, 2)
|
|
135
|
+
>>> A = mt.array(('a', 'b', 'c', 'd'), dtype=object)
|
|
136
|
+
>>> A.shape = (2, 2)
|
|
137
|
+
>>> a.execute(); A.execute()
|
|
138
|
+
array([[[1, 2],
|
|
139
|
+
[3, 4]],
|
|
140
|
+
[[5, 6],
|
|
141
|
+
[7, 8]]])
|
|
142
|
+
array([[a, b],
|
|
143
|
+
[c, d]], dtype=object)
|
|
144
|
+
|
|
145
|
+
>>> mt.tensordot(a, A).execute() # third argument default is 2 for double-contraction
|
|
146
|
+
array([abbcccdddd, aaaaabbbbbbcccccccdddddddd], dtype=object)
|
|
147
|
+
|
|
148
|
+
>>> mt.tensordot(a, A, 1).execute()
|
|
149
|
+
array([[[acc, bdd],
|
|
150
|
+
[aaacccc, bbbdddd]],
|
|
151
|
+
[[aaaaacccccc, bbbbbdddddd],
|
|
152
|
+
[aaaaaaacccccccc, bbbbbbbdddddddd]]], dtype=object)
|
|
153
|
+
|
|
154
|
+
>>> mt.tensordot(a, A, 0).execute() # tensor product (result too long to incl.)
|
|
155
|
+
array([[[[[a, b],
|
|
156
|
+
[c, d]],
|
|
157
|
+
...
|
|
158
|
+
|
|
159
|
+
>>> mt.tensordot(a, A, (0, 1)).execute()
|
|
160
|
+
array([[[abbbbb, cddddd],
|
|
161
|
+
[aabbbbbb, ccdddddd]],
|
|
162
|
+
[[aaabbbbbbb, cccddddddd],
|
|
163
|
+
[aaaabbbbbbbb, ccccdddddddd]]], dtype=object)
|
|
164
|
+
|
|
165
|
+
>>> mt.tensordot(a, A, (2, 1)).execute()
|
|
166
|
+
array([[[abb, cdd],
|
|
167
|
+
[aaabbbb, cccdddd]],
|
|
168
|
+
[[aaaaabbbbbb, cccccdddddd],
|
|
169
|
+
[aaaaaaabbbbbbbb, cccccccdddddddd]]], dtype=object)
|
|
170
|
+
|
|
171
|
+
>>> mt.tensordot(a, A, ((0, 1), (0, 1))).execute()
|
|
172
|
+
array([abbbcccccddddddd, aabbbbccccccdddddddd], dtype=object)
|
|
173
|
+
|
|
174
|
+
>>> mt.tensordot(a, A, ((2, 1), (1, 0))).execute()
|
|
175
|
+
array([acccbbdddd, aaaaacccccccbbbbbbdddddddd], dtype=object)
|
|
176
|
+
"""
|
|
177
|
+
a = astensor(a)
|
|
178
|
+
b = astensor(b)
|
|
179
|
+
|
|
180
|
+
if isinstance(axes, Iterable):
|
|
181
|
+
a_axes, b_axes = axes
|
|
182
|
+
else:
|
|
183
|
+
a_axes = tuple(range(a.ndim - 1, a.ndim - axes - 1, -1))
|
|
184
|
+
b_axes = tuple(range(0, axes))
|
|
185
|
+
|
|
186
|
+
if isinstance(a_axes, Iterable):
|
|
187
|
+
a_axes = tuple(a_axes)
|
|
188
|
+
else:
|
|
189
|
+
a_axes = (a_axes,)
|
|
190
|
+
a_axes = tuple(axis if axis >= 0 else a.ndim + axis for axis in a_axes)
|
|
191
|
+
if isinstance(b_axes, Iterable):
|
|
192
|
+
b_axes = tuple(b_axes)
|
|
193
|
+
else:
|
|
194
|
+
b_axes = (b_axes,)
|
|
195
|
+
b_axes = tuple(axis if axis >= 0 else b.ndim + axis for axis in b_axes)
|
|
196
|
+
|
|
197
|
+
if (
|
|
198
|
+
a.shape
|
|
199
|
+
and b.shape
|
|
200
|
+
and not np.array_equal(
|
|
201
|
+
np.array(a.shape)[list(a_axes)], np.array(b.shape)[list(b_axes)]
|
|
202
|
+
)
|
|
203
|
+
):
|
|
204
|
+
raise ValueError("shape-mismatch for sum")
|
|
205
|
+
|
|
206
|
+
sparse = sparse if sparse is not None else a.issparse() and b.issparse()
|
|
207
|
+
op = TensorTensorDot(
|
|
208
|
+
a_axes=a_axes,
|
|
209
|
+
b_axes=b_axes,
|
|
210
|
+
dtype=np.promote_types(a.dtype, b.dtype),
|
|
211
|
+
sparse=sparse,
|
|
212
|
+
)
|
|
213
|
+
return op(a, b)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..datasource import tensor as astensor
|
|
16
|
+
from .dot import dot
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def vdot(a, b):
|
|
20
|
+
"""
|
|
21
|
+
Return the dot product of two vectors.
|
|
22
|
+
|
|
23
|
+
The vdot(`a`, `b`) function handles complex numbers differently than
|
|
24
|
+
dot(`a`, `b`). If the first argument is complex the complex conjugate
|
|
25
|
+
of the first argument is used for the calculation of the dot product.
|
|
26
|
+
|
|
27
|
+
Note that `vdot` handles multidimensional tensors differently than `dot`:
|
|
28
|
+
it does *not* perform a matrix product, but flattens input arguments
|
|
29
|
+
to 1-D vectors first. Consequently, it should only be used for vectors.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
a : array_like
|
|
34
|
+
If `a` is complex the complex conjugate is taken before calculation
|
|
35
|
+
of the dot product.
|
|
36
|
+
b : array_like
|
|
37
|
+
Second argument to the dot product.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
output : Tensor
|
|
42
|
+
Dot product of `a` and `b`. Can be an int, float, or
|
|
43
|
+
complex depending on the types of `a` and `b`.
|
|
44
|
+
|
|
45
|
+
See Also
|
|
46
|
+
--------
|
|
47
|
+
dot : Return the dot product without using the complex conjugate of the
|
|
48
|
+
first argument.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import maxframe.tensor as mt
|
|
53
|
+
|
|
54
|
+
>>> a = mt.array([1+2j,3+4j])
|
|
55
|
+
>>> b = mt.array([5+6j,7+8j])
|
|
56
|
+
>>> mt.vdot(a, b).execute()
|
|
57
|
+
(70-8j)
|
|
58
|
+
>>> mt.vdot(b, a).execute()
|
|
59
|
+
(70+8j)
|
|
60
|
+
|
|
61
|
+
Note that higher-dimensional arrays are flattened!
|
|
62
|
+
|
|
63
|
+
>>> a = mt.array([[1, 4], [5, 6]])
|
|
64
|
+
>>> b = mt.array([[4, 1], [2, 2]])
|
|
65
|
+
>>> mt.vdot(a, b).execute()
|
|
66
|
+
30
|
|
67
|
+
>>> mt.vdot(b, a).execute()
|
|
68
|
+
30
|
|
69
|
+
>>> 1*4 + 4*1 + 5*2 + 6*2
|
|
70
|
+
30
|
|
71
|
+
"""
|
|
72
|
+
a, b = astensor(a), astensor(b)
|
|
73
|
+
return dot(a.conj().ravel(), b.ravel())
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from .append import append
|
|
16
|
+
from .column_stack import column_stack
|
|
15
17
|
from .concatenate import concatenate
|
|
18
|
+
from .dstack import dstack
|
|
19
|
+
from .hstack import hstack
|
|
16
20
|
from .stack import stack
|
|
17
21
|
from .vstack import vstack
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..datasource.array import asarray
|
|
16
|
+
from ..misc.ravel import ravel
|
|
17
|
+
from .concatenate import concatenate
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def append(arr, values, axis=None):
|
|
21
|
+
"""
|
|
22
|
+
Append values to the end of an array.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
arr : array_like
|
|
27
|
+
Values are appended to a copy of this array.
|
|
28
|
+
values : array_like
|
|
29
|
+
These values are appended to a copy of `arr`. It must be of the
|
|
30
|
+
correct shape (the same shape as `arr`, excluding `axis`). If
|
|
31
|
+
`axis` is not specified, `values` can be any shape and will be
|
|
32
|
+
flattened before use.
|
|
33
|
+
axis : int, optional
|
|
34
|
+
The axis along which `values` are appended. If `axis` is not
|
|
35
|
+
given, both `arr` and `values` are flattened before use.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
append : Tensor
|
|
40
|
+
A copy of `arr` with `values` appended to `axis`. Note that
|
|
41
|
+
`append` does not occur in-place: a new array is allocated and
|
|
42
|
+
filled. If `axis` is None, `out` is a flattened array.
|
|
43
|
+
|
|
44
|
+
See Also
|
|
45
|
+
--------
|
|
46
|
+
insert : Insert elements into an array.
|
|
47
|
+
delete : Delete elements from an array.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import maxframe.tensor as mt
|
|
52
|
+
|
|
53
|
+
>>> mt.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]]).execute()
|
|
54
|
+
array([1, 2, 3, ..., 7, 8, 9])
|
|
55
|
+
|
|
56
|
+
When `axis` is specified, `values` must have the correct shape.
|
|
57
|
+
|
|
58
|
+
>>> mt.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0).execute()
|
|
59
|
+
array([[1, 2, 3],
|
|
60
|
+
[4, 5, 6],
|
|
61
|
+
[7, 8, 9]])
|
|
62
|
+
>>> mt.append([[1, 2, 3], [4, 5, 6]], [7, 8, 9], axis=0)
|
|
63
|
+
Traceback (most recent call last):
|
|
64
|
+
...
|
|
65
|
+
ValueError: all the input tensors must have same number of dimensions
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
arr = asarray(arr)
|
|
69
|
+
if axis is None:
|
|
70
|
+
if arr.ndim != 1:
|
|
71
|
+
arr = arr.ravel()
|
|
72
|
+
values = ravel(values)
|
|
73
|
+
axis = arr.ndim - 1
|
|
74
|
+
return concatenate((arr, values), axis=axis)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..datasource import tensor as astensor
|
|
16
|
+
from .concatenate import concatenate
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def column_stack(tup):
|
|
20
|
+
"""
|
|
21
|
+
Stack 1-D tensors as columns into a 2-D tensor.
|
|
22
|
+
|
|
23
|
+
Take a sequence of 1-D tensors and stack them as columns
|
|
24
|
+
to make a single 2-D tensor. 2-D tensors are stacked as-is,
|
|
25
|
+
just like with `hstack`. 1-D tensors are turned into 2-D columns
|
|
26
|
+
first.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
tup : sequence of 1-D or 2-D tensors.
|
|
31
|
+
Tensors to stack. All of them must have the same first dimension.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
stacked : 2-D tensor
|
|
36
|
+
The tensor formed by stacking the given tensors.
|
|
37
|
+
|
|
38
|
+
See Also
|
|
39
|
+
--------
|
|
40
|
+
stack, hstack, vstack, concatenate
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import maxframe.tensor as mt
|
|
45
|
+
|
|
46
|
+
>>> a = mt.array((1,2,3))
|
|
47
|
+
>>> b = mt.array((2,3,4))
|
|
48
|
+
>>> mt.column_stack((a,b)).execute()
|
|
49
|
+
array([[1, 2],
|
|
50
|
+
[2, 3],
|
|
51
|
+
[3, 4]])
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
from ..datasource import array
|
|
55
|
+
|
|
56
|
+
arrays = []
|
|
57
|
+
for a in tup:
|
|
58
|
+
a = astensor(a)
|
|
59
|
+
if a.ndim < 2:
|
|
60
|
+
a = array(a, ndmin=2).T
|
|
61
|
+
arrays.append(a)
|
|
62
|
+
|
|
63
|
+
return concatenate(arrays, 1)
|
|
@@ -24,7 +24,7 @@ from ..utils import validate_axis
|
|
|
24
24
|
class TensorConcatenate(TensorOperator, TensorOperatorMixin):
|
|
25
25
|
_op_type_ = opcodes.CONCATENATE
|
|
26
26
|
|
|
27
|
-
axis = Int32Field("axis", default=
|
|
27
|
+
axis = Int32Field("axis", default=None)
|
|
28
28
|
|
|
29
29
|
def __call__(self, tensors):
|
|
30
30
|
axis = self.axis
|
|
@@ -93,8 +93,9 @@ def concatenate(tensors, axis=0):
|
|
|
93
93
|
|
|
94
94
|
def _concatenate(tensors, axis=0):
|
|
95
95
|
dtype = np.result_type(*(t.dtype for t in tensors))
|
|
96
|
+
sparse = all(t.issparse() for t in tensors)
|
|
96
97
|
|
|
97
|
-
op = TensorConcatenate(axis=axis, dtype=dtype)
|
|
98
|
+
op = TensorConcatenate(axis=axis, dtype=dtype, sparse=sparse)
|
|
98
99
|
return op(tensors)
|
|
99
100
|
|
|
100
101
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..misc import atleast_3d
|
|
16
|
+
from .concatenate import concatenate
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def dstack(tup):
|
|
20
|
+
"""
|
|
21
|
+
Stack tensors in sequence depth wise (along third axis).
|
|
22
|
+
|
|
23
|
+
This is equivalent to concatenation along the third axis after 2-D tensors
|
|
24
|
+
of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape
|
|
25
|
+
`(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by
|
|
26
|
+
`dsplit`.
|
|
27
|
+
|
|
28
|
+
This function makes most sense for arrays with up to 3 dimensions. For
|
|
29
|
+
instance, for pixel-data with a height (first axis), width (second axis),
|
|
30
|
+
and r/g/b channels (third axis). The functions `concatenate`, `stack` and
|
|
31
|
+
`block` provide more general stacking and concatenation operations.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
tup : sequence of tensors
|
|
36
|
+
The tensors must have the same shape along all but the third axis.
|
|
37
|
+
1-D or 2-D arrays must have the same shape.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
stacked : Tensor
|
|
42
|
+
The array formed by stacking the given tensors, will be at least 3-D.
|
|
43
|
+
|
|
44
|
+
See Also
|
|
45
|
+
--------
|
|
46
|
+
stack : Join a sequence of tensors along a new axis.
|
|
47
|
+
vstack : Stack along first axis.
|
|
48
|
+
hstack : Stack along second axis.
|
|
49
|
+
concatenate : Join a sequence of arrays along an existing axis.
|
|
50
|
+
dsplit : Split tensor along third axis.
|
|
51
|
+
|
|
52
|
+
Examples
|
|
53
|
+
--------
|
|
54
|
+
>>> import maxframe.tensor as mt
|
|
55
|
+
|
|
56
|
+
>>> a = mt.array((1,2,3))
|
|
57
|
+
>>> b = mt.array((2,3,4))
|
|
58
|
+
>>> mt.dstack((a,b)).execute()
|
|
59
|
+
array([[[1, 2],
|
|
60
|
+
[2, 3],
|
|
61
|
+
[3, 4]]])
|
|
62
|
+
|
|
63
|
+
>>> a = mt.array([[1],[2],[3]])
|
|
64
|
+
>>> b = mt.array([[2],[3],[4]])
|
|
65
|
+
>>> mt.dstack((a,b)).execute()
|
|
66
|
+
array([[[1, 2]],
|
|
67
|
+
[[2, 3]],
|
|
68
|
+
[[3, 4]]])
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
return concatenate([atleast_3d(t) for t in tup], axis=2)
|